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 "D:\\development\\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 "D:\\development\\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文件夹使用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
20cmake_minimum_required(VERSION 3.14)
# 设置项目名称和版本
project(MyQtApp VERSION 0.1 LANGUAGES CXX)
#系统变量中没有Qt目录需要添加此句
set(CMAKE_PREFIX_PATH "D:\\development\\Qt\\6.7.0\\mingw_64")
# 查找 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 Qt6::Core Qt6::Widgets)创建构建目录
1
mkdir build
切换到build目录
1
cd build
使用cmake命令生成配置
1
cmake -G "Unix Makefiles" ..
编译项目
1
make
运行程序
1
./MyQtApp
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
