Vscode中使用Cmake构建项目

1. 在QtCreate中创建新的项目,使用Cmake构建,编译链使用MSVC,使用静态版本的Qt库,多线程编译64位

  1. 使用Cmake生成配置文件
1
cmake .. -A x64

生成失败,提示

1
2
3
4
5
6
7
Could not find a package configuration file provided by "QT" with any of
the following names:

Qt6Config.cmake
qt6-config.cmake
Qt5Config.cmake
qt5-config.cmake
  1. 原因是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
    72
    cmake_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
  2. 编译

    1
    cmake --build . --config Release
  3. 多线程编译

    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

  1. 在当前目录创建一个CMake文件夹使用vscode打开。

  2. 编写代码main.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <QApplication>
    #include <QPushButton>

    int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QPushButton button("Hello, Qt!");
    button.resize(200, 100);
    button.show();

    return app.exec();
    }
  3. 创建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
    cmake_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()
  4. 创建构建目录

    1
    mkdir build
  5. 切换到build目录

    1
    cd build
  6. 使用cmake命令生成配置

    1
    cmake .. -A x64
  7. 编译项目

    1
    cmake --build . --config Release
  8. 运行程序

    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
2
3
4
5
6
7
8
9
10
11
12
# 1. 创建并进入构建目录
mkdir build_ninja
cd build_ninja

# 2. 配置时指定生成器为 Ninja
# 必须在开发者终端下运行,否则会报找不到编译器错误
cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="C:/D/Program/Qt/6.2.4/MSVC2022_x64_static_64_Release"

# 3. 执行编译
ninja
# 或者使用 cmake 通用指令
cmake --build . -j8

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
2
3
4
5
6
if(MSVC)
target_link_libraries(${PROJECT_NAME} PRIVATE ucrt.lib vcruntime.lib msvcrt.lib)
set_target_properties(Calculator PROPERTIES
MSVC_RUNTIME_LIBRARY "MultiThreadedDLL"
)
endif()

qt的方式构建

1
2
C:\D\Program\Qt\6.2.4\MSVC2022_x64_static_624_Release\bin\qt-cmake.bat -G Ninja -S . -B build
cmake --build 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
2
3
4
5
6
7
8
9
10
11
# 配置
cmake -G "Ninja" ^
-DCMAKE_C_COMPILER="gcc.exe" ^
-DCMAKE_CXX_COMPILER="g++.exe" ^
-DCMAKE_PREFIX_PATH="C:/D/Program/Qt/6.9.0/mingw_64" ^
-DCMAKE_BUILD_TYPE=Release ^
-S . -B out/build/qt-mingw-ninja

# 构建
#ninja
cmake --build out/build/qt-mingw-ninja

使用qt的qt-cmake.bat构建

1
2
3
4
5
6
7
8
9
10
:: 1. 配置
C:\D\Program\Qt\6.9.0\mingw_64\bin\qt-cmake.bat ^
-G "MinGW Makefiles" ^
-DCMAKE_C_COMPILER=gcc ^
-DCMAKE_CXX_COMPILER=g++ ^
-DCMAKE_BUILD_TYPE=Debug ^
-S . -B build-mingw

:: 2. 编译 (使用 -j 参数开启多线程加速)
cmake --build build-mingw -j8

配置qt环境构建

方法一:

打开Qt 6.9.0 (MinGW 13.1.0 64-bit)或者打开qtenv2.bat.

qtenv2.bat.

1
2
3
4
@echo off
echo Setting up environment for Qt usage...
set PATH=C:\D\Program\Qt\6.9.0\mingw_64\bin;C:\D\Program\Qt\Tools\mingw1310_64\bin;%PATH%
cd /D C:\D\Program\Qt\6.9.0\mingw_64

方法二:

如果已经在普通 CMD 中,可以通过调用脚本切换(注意必须使用 call):

1
call "C:\D\Program\Qt\6.9.0\mingw_64\bin\qtenv2.bat"

编译命令

1
2
C:\D\Program\Qt\6.9.0\mingw_64\bin\qt-cmake.bat -G "MinGW Makefiles" -S . -B build-mingw
cmake --build build-mingw -j8

使用qt-cmake.bat与ninga构建

1
2
3
4
5
# 1. 配置(明确指定 Ninja)
C:\D\Program\Qt\6.9.0\mingw_64\bin\qt-cmake.bat -G Ninja -S . -B build-ninja

# 2. 编译
cmake --build build-ninja