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 "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
    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 "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
  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工程

  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
    cmake_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)
  4. 创建构建目录

    1
    mkdir build
  5. 切换到build目录

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

    1
    cmake -G "Unix Makefiles" ..
  7. 编译项目

    1
    make
  8. 运行程序

    1
    ./MyQtApp