📚 博主的专栏
🐧 Linux | 🖥️ C++ | 📊 数据结构 | 💡C++ 算法 | 🅒 C 语言 | 🌐 计算机网络 |🗃️ mysql
本文摘要:本文介绍了使用CMake构建Qt项目的配置方法,分别针对MSVC和MinGW两种编译器环境。主要内容包括:1)创建构建目录并配置CMake命令,指定Qt路径和生成器类型;2)提供CMakeLists.txt文件示例,展示Qt项目基础配置、文件收集和链接设置;3)特别说明MinGW环境下需要添加的资源文件处理配置;4)给出两种编译环境下构建和运行项目的具体步骤。文章还包含环境变量设置建议和编译器检测代码,帮助开发者解决构建过程中的常见问题。
这是我的源代码文件目录:
可以在命令行先创建好一个目录build:mkdir build
MSVC
确保在 CMake 中指定使用 MSVC 的生成器。
例如,你可以使用以下命令来生成构建文件:
cmake .. -G "Visual Studio 17 2022" -DCMAKE_PREFIX_PATH="E:\qt\Qt5.14.2\5.14.2\msvc2017_64\lib\cmake\Qt5"
(1) 生成构建系统
cmake .. -G "Visual Studio 17 2022" -DCMAKE_PREFIX_PATH="E:\qt\Qt5.14.2\5.14.2\msvc2017_64\lib\cmake\Qt5"
..
: 表示CMakeLists.txt在上级目录(即项目根目录)
-G "Visual Studio 17 2022"
: 指定生成VS2022解决方案
-DCMAKE_PREFIX_PATH=...
: 覆盖CMakeLists.txt中的Qt5_DIR
,告诉CMake在哪里找Qt
关键路径:
E:\qt\Qt5.14.2\5.14.2\msvc2017_64\lib\cmake\Qt5
包含
Qt5Config.cmake
等配置文件
接下来在命令行中:
cmake --build . --config Release
cmake --build . -j
--build .
: 在当前目录(build/
)编译
--config Release
: 构建Release版本(VS多配置需显式指定)生成位置:
build/Release/MyCMakeProject.exe
最后可以通过在文件目录中输入标红处:运行项目
在命令行:
E:\code\qt-learning-and-practice\TestCMakeQt\build\Release\MyCMakeProject.exe
在build文件中Release中点击 .exe文件运行:就可以执行
在vs2022中从.sin文件打开项目,运行目标项目也可以成功
注意:在配置环境变量的时候:要将他们至顶
我的CMakeLists.txt文件:
# 基础配置 cmake_minimum_required(VERSION 3.5) project(MyCMakeProject VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) # Qt5 配置(你的命令行覆盖了此处) find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED) set(CMAKE_AUTOMOC ON) # 自动处理Qt元对象编译 set(CMAKE_AUTOUIC ON) # 自动处理UI文件 set(CMAKE_AUTORCC ON) # 自动编译资源文件(.qrc) # 收集文件 file(GLOB SOURCES "*.cpp") # 包含所有.cpp file(GLOB HEADERS "*.h") # 包含所有.h set(RESOURCES resource.qrc) # 资源文件 # 生成可执行文件 add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${RESOURCES}) target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Widgets)
MINGW
注意有时候需要添加上后两个,看是用的c还是c++、显式指定 C 和 C++ 编译器:
cmake .. -G "MinGW Makefiles" `
-DCMAKE_PREFIX_PATH="E:/qt/Qt5.14.2/5.14.2/mingw73_64/lib/cmake/Qt5" `
-DCMAKE_MAKE_PROGRAM="E:/qt/Qt5.14.2/Tools/mingw730_64/bin/mingw32-make.exe" `
-DCMAKE_C_COMPILER="E:/qt/Qt5.14.2/Tools/mingw730_64/bin/gcc.exe" `
-DCMAKE_CXX_COMPILER="E:/qt/Qt5.14.2/Tools/mingw730_64/bin/g++.exe"
cmake ..
:
这部分表示运行 CMake 命令,并且
..
表示 CMakeLists.txt 文件位于当前目录的上级目录。也就是说,你在构建目录中运行这个命令,而 CMakeLists.txt 文件位于构建目录的上一级。
-G "MinGW Makefiles"
:
-G
选项用于指定 CMake 的生成器。这里的"MinGW Makefiles"
表示使用 MinGW 的 makefile 生成器。这意味着 CMake 将生成适合 MinGW 的 makefile 文件,以便后续使用mingw32-make
进行构建。
-DCMAKE_PREFIX_PATH="E:/qt/Qt5.14.2/5.14.2/mingw73_64/lib/cmake/Qt5"
:
-D
用于设置 CMake 的缓存变量。CMAKE_PREFIX_PATH
是一个变量,用于指定查找库、头文件等的前缀路径。这里设置为 Qt5 的安装路径,帮助 CMake 找到 Qt5 的库和相关文件。
-DCMAKE_MAKE_PROGRAM="E:/qt/Qt5.14.2/Tools/mingw730_64/bin/mingw32-make.exe"
:
这个选项明确指定了
CMAKE_MAKE_PROGRAM
变量,即用于构建项目的 make 程序路径。这里指向了 MinGW 的mingw32-make.exe
可执行文件,确保 CMake 能够找到并使用正确的构建工具。
这里对我的CMakeLists.txt做了修改:
cmake_minimum_required(VERSION 3.10) project(TestMinGw VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # === 主要修改点 1:移除 MSVC 特定的 Qt 路径 === set(Qt5_DIR "E:/qt/Qt5.14.2/5.14.2/mingw73_64/lib/cmake/Qt5") # 使用通用方式查找 Qt find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED) # 启用自动处理 set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) # === 主要修改点 2:修复文件收集方式 === # 避免使用 GLOB(可能导致新文件不被检测) set(SOURCES chatwidget.cpp friendlistwidget.cpp friendlistwidgetdelegate.cpp main.cpp ) set(HEADERS chatwidget.h friendlistwidget.h friendlistwidgetdelegate.h ) set(RESOURCES resource.qrc) # 添加可执行文件 add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${RESOURCES} ) # 链接 Qt 库 target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Widgets ) # === 新增:MinGW 特定设置 === if(MINGW) # 解决 MinGW 资源文件路径问题 set(CMAKE_RC_COMPILER_INIT windres) enable_language(RC) set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> -O coff <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> <SOURCE>") endif()
用途:
这段代码用于检测当前的构建环境是否是 MinGW 环境。
如果是,它会进行一些特定的配置,以确保 MinGW 正确处理资源文件(
.rc
文件)。具体配置解释:
set(CMAKE_RC_COMPILER_INIT windres)
:设置资源编译器为windres
,这是 MinGW 用于处理 Windows 资源文件的工具。
enable_language(RC)
:启用资源语言(Resource Compiler),以便在构建过程中处理.rc
文件。
set(CMAKE_RC_COMPILE_OBJECT ... )
:定义资源文件的编译命令格式,确保资源文件被正确编译为对象文件。场景:
这段代码通常用于处理 Windows 系统下的资源文件(如图标、菜单等),这些文件通常以
.rc
格式存在。当使用 MinGW 构建包含资源文件的项目时,这段代码确保资源文件被正确处理并链接到最终的可执行文件中。
不行的时候使用这个语句:
if (CMAKE_COMPILER_IS_GNUCXX) message(STATUS "Using MinGW compiler: ${CMAKE_CXX_COMPILER}") else() message(FATAL_ERROR "MinGW compiler not found") endif()
用途:
这段代码用于检查当前使用的 C++ 编译器是否是 GNU C++ 编译器(即 MinGW 的
g++
编译器)。如果是,它会输出一条状态消息,显示当前使用的 C++ 编译器路径。
如果不是,它会输出一条致命错误消息,指出没有找到 MinGW 编译器。
场景:
这段代码通常用于确保项目使用的是 MinGW 编译器,而不是其他编译器(如 MSVC)。
如果你希望项目只能使用 MinGW 编译器进行构建,这段代码可以帮助你在构建过程中提前检测并避免使用错误的编译器。
注意此时环境变量的顺序
运行程序
在命令行直接输入可执行程序的绝对路径
E:\code\qt-learning-and-practice\TestMinGw\build-mingw\TestMinGw.exe
或者直接在文件中打开这个.exe文件
结语:
随着这篇博客接近尾声,我衷心希望我所分享的内容能为你带来一些启发和帮助。学习和理解的过程往往充满挑战,但正是这些挑战让我们不断成长和进步。我在准备这篇文章时,也深刻体会到了学习与分享的乐趣。
在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我持续写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开大家的鼓励与指正。因此,如果你在阅读过程中有任何疑问、建议或是发现了文章中的不足之处,都欢迎你慷慨赐教。
你的每一条反馈都是我前进路上的宝贵财富。同时,我也非常期待能够得到你的点赞、收藏,关注这将是对我莫大的支持和鼓励。当然,我更期待的是能够持续为你带来有价值的内容。