3.在vscode中使用Cmake构建Qt项目
Vscode中使用Cmake构建项目
1. 在QtCreate中创建新的项目,使用Cmake构建,编译链使用MSVC,使用静态版本的Qt库,多线程编译64位
- 使用Cmake生成配置文件
1 | cmake .. -A x64 |
生成失败,提示
1 | Could not find a package configuration file provided by "QT" with any of |
原因是Cmake工具找不到Qt库,修复办法有两种
第一种:将Qt库中的
bin目录添加到系统变量后就能解决。第二种:在Cmake配置中添加Qt库路径,就能修复。在CmakeLists.txt中添加一行内容。
1
set(CMAKE_PREFIX_PATH "C:\\D\\Program\\Qt\\6.2.4\\MSVC2022_x64_static_624_Release")
CmakeLists.txt完整内容如下所示1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72cmake_minimum_required(VERSION 3.5)
project(Cmake_QWidget_Static VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_PREFIX_PATH "C:\\D\\Program\\Qt\\6.2.4\\MSVC2022_x64_static_624_Release")
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
set(PROJECT_SOURCES
main.cpp
widget.cpp
widget.h
widget.ui
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(Cmake_QWidget_Static
MANUAL_FINALIZATION
${PROJECT_SOURCES}
)
# Define target properties for Android with Qt 6 as:
# set_property(TARGET Cmake_QWidget_Static APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
# ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
if(ANDROID)
add_library(Cmake_QWidget_Static SHARED
${PROJECT_SOURCES}
)
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else()
add_executable(Cmake_QWidget_Static
${PROJECT_SOURCES}
)
endif()
endif()
target_link_libraries(Cmake_QWidget_Static PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.Cmake_QWidget_Static)
endif()
set_target_properties(Cmake_QWidget_Static PROPERTIES
${BUNDLE_ID_OPTION}
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
include(GNUInstallDirs)
install(TARGETS Cmake_QWidget_Static
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(Cmake_QWidget_Static)
endif()此时在命令行中生成Cmake配置文件就能成功
1
cmake .. -A x64
编译
1
cmake --build . --config Release
多线程编译
1
cmake --build . --config Release -j8
将编译命令写成脚本build.bat
1 | "C:\Program Files\CMake\bin\cmake.EXE" -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE --no-warn-unused-cli -SD:/test/CC++/qt/vscode/cmake_template/Cmake_QWidget_Static -Bd:/test/CC++/qt/vscode/cmake_template/Cmake_QWidget_Static/build/Desktop_Qt_6_2_4_MSVC_static_Release-Release -G "Visual Studio 17 2022" -T host=x64 -A x64 |
2. 手动编写CMake工程
cmake使用msvc编译器编译静态链接qt项目x64
在当前目录创建一个CMake文件夹使用vscode打开。
编写代码main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QPushButton button("Hello, Qt!");
button.resize(200, 100);
button.show();
return app.exec();
}创建CMakeLists.txt文件,并填入以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23cmake_minimum_required(VERSION 3.14)
# 设置项目名称和版本
project(MyQtApp VERSION 0.1 LANGUAGES CXX)
#系统变量中没有Qt目录需要添加此句
set(CMAKE_PREFIX_PATH "C:\\D\\Program\\Qt\\6.2.4\\MSVC2022_x64_static_624_Release")
# 查找 Qt 6 包
find_package(Qt6 REQUIRED COMPONENTS Core Widgets)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 添加可执行文件
add_executable(MyQtApp main.cpp)
# 链接 Qt 库
target_link_libraries(MyQtApp PRIVATE Qt6::Core Qt6::Widgets)
if(MSVC)
target_link_libraries(${PROJECT_NAME} PRIVATE ucrt.lib vcruntime.lib msvcrt.lib)
endif()创建构建目录
1
mkdir build
切换到build目录
1
cd build
使用cmake命令生成配置
1
cmake .. -A x64
编译项目
1
cmake --build . --config Release
运行程序
1
./MyQtApp
msvc编译器配合其他构建方式不在CMakeLists.txt设置路径
- x64 架构:打开 **”x64 Native Tools Command Prompt for VS 2022”**。此时运行
cl.exe会默认输出 x64 目标代码。 - x86 架构:打开 **”x86 Native Tools Command Prompt for VS 2022”**。
如果已经在普通 CMD 中,可以通过调用脚本切换(注意必须使用 call):
1 | call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 |
库路径设置:通过 CMAKE_PREFIX_PATH
Ninja构建方式
1 | # 1. 创建并进入构建目录 |
nmake
这是微软随 Visual Studio 提供的原生命令行构建工具。你可以把它看作是“精简版、无界面的 MSBuild”。
特点:
- 单线程执行:这是它最大的缺点。
nmake不支持并行编译(类似于make -j8的功能它没有),在编译 Qt 这样的大型项目时速度非常慢。 - 环境依赖:和 Ninja 一样,必须在“开发者命令提示符”下运行。
- 单线程执行:这是它最大的缺点。
如何使用:
1
2
3
4
5
6
7
8
9
10
11
12
13:: 确保在 x64 开发者命令提示符中
mkdir build_nmake
cd build_nmake
:: 配置(指定 NMake 生成器)
cmake -G "NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Release ^
-DCMAKE_PREFIX_PATH="C:/D/Program/Qt/6.2.4/MSVC2022_x64_static_624_Release" ^
-DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded" ^
..
:: 构建
nmake
qt如果是半静态也就是msvc的链接是动态的话需要强制指定项目为MD
1 | if(MSVC) |
qt的方式构建
1 | C:\D\Program\Qt\6.2.4\MSVC2022_x64_static_624_Release\bin\qt-cmake.bat -G Ninja -S . -B build |
cmake使用gcc编译器动态链接qt项目x64
make (MinGW / Unix Makefiles)
当你使用 MinGW 编译器时(比如你之前成功的 Debug 版本),通常使用的就是 make(在 Windows 上通常叫 mingw32-make.exe)。
特点:
- 支持并行:可以使用
-j参数(例如mingw32-make -j12)。 - 跨平台标准:是 Linux/macOS 的标准工具,在 Windows 上通过 MinGW 环境模拟。
- 支持并行:可以使用
如何使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 1. 创建并进入构建目录
mkdir build_mingw
cd build_mingw
# 2. 配置工程 (指定生成器为 MinGW Makefiles)
# 注意:确保你的 g++.exe 所在目录已加入系统 PATH
cmake -G "MinGW Makefiles" ^
-DCMAKE_C_COMPILER="gcc" ^
-DCMAKE_CXX_COMPILER="g++" ^
-DCMAKE_PREFIX_PATH="C:/D/Program/Qt/6.9.0/mingw_64" ^
-DCMAKE_BUILD_TYPE=Release ^
..
# 3. 执行编译 (使用 -j 参数开启多核加速)
mingw32-make -j8
使用 Ninja 编译(速度最快)
如果安装了 Ninja(Qt 安装时通常会带,或者 VS 也带),强烈建议用这个:
1 | # 配置 |
使用qt的qt-cmake.bat构建
1 | :: 1. 配置 |
配置qt环境构建
方法一:
打开Qt 6.9.0 (MinGW 13.1.0 64-bit)或者打开qtenv2.bat.
qtenv2.bat.
1 | @echo off |
方法二:
如果已经在普通 CMD 中,可以通过调用脚本切换(注意必须使用 call):
1 | call "C:\D\Program\Qt\6.9.0\mingw_64\bin\qtenv2.bat" |
编译命令
1 | C:\D\Program\Qt\6.9.0\mingw_64\bin\qt-cmake.bat -G "MinGW Makefiles" -S . -B build-mingw |
使用qt-cmake.bat与ninga构建
1 | # 1. 配置(明确指定 Ninja) |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
