【cmake】msvc、mingw

📚 博主的专栏

🐧 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"
  1. cmake ..:

    • 这部分表示运行 CMake 命令,并且 .. 表示 CMakeLists.txt 文件位于当前目录的上级目录。也就是说,你在构建目录中运行这个命令,而 CMakeLists.txt 文件位于构建目录的上一级。

  2. -G "MinGW Makefiles":

    • -G 选项用于指定 CMake 的生成器。这里的 "MinGW Makefiles" 表示使用 MinGW 的 makefile 生成器。这意味着 CMake 将生成适合 MinGW 的 makefile 文件,以便后续使用 mingw32-make 进行构建。

  3. -DCMAKE_PREFIX_PATH="E:/qt/Qt5.14.2/5.14.2/mingw73_64/lib/cmake/Qt5":

    • -D 用于设置 CMake 的缓存变量。CMAKE_PREFIX_PATH 是一个变量,用于指定查找库、头文件等的前缀路径。这里设置为 Qt5 的安装路径,帮助 CMake 找到 Qt5 的库和相关文件。

  4. -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文件

结语:

       随着这篇博客接近尾声,我衷心希望我所分享的内容能为你带来一些启发和帮助。学习和理解的过程往往充满挑战,但正是这些挑战让我们不断成长和进步。我在准备这篇文章时,也深刻体会到了学习与分享的乐趣。    

         在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我持续写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开大家的鼓励与指正。因此,如果你在阅读过程中有任何疑问、建议或是发现了文章中的不足之处,都欢迎你慷慨赐教。

        你的每一条反馈都是我前进路上的宝贵财富。同时,我也非常期待能够得到你的点赞、收藏,关注这将是对我莫大的支持和鼓励。当然,我更期待的是能够持续为你带来有价值的内容。

内容概要:本文档详细介绍了一个基于MATLAB实现的跨尺度注意力机制(CSA)结合Transformer编码器的多变量时间序列预测项目。项目旨在精准捕捉多尺度时间序列特征,提升多变量时间序列的预测性能,降低模型计算复杂度与训练时间,增强模型的解释性和可视化能力。通过跨尺度注意力机制,模型可以同时捕获局部细节和全局趋势,显著提升预测精度和泛化能力。文档还探讨了项目面临的挑战,如多尺度特征融合、多变量复杂依赖关系、计算资源瓶颈等问题,并提出了相应的解决方案。此外,项目模型架构包括跨尺度注意力机制模块、Transformer编码器层和输出预测层,文档最后提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,尤其是熟悉MATLAB和深度学习的科研人员、工程师和研究生。 使用场景及目标:①需要处理多变量、多尺度时间序列数据的研究和应用场景,如金融市场分析、气象预测、工业设备监控、交通流量预测等;②希望深入了解跨尺度注意力机制和Transformer编码器在时间序列预测中的应用;③希望通过MATLAB实现高效的多变量时间序列预测模型,提升预测精度和模型解释性。 其他说明:此项目不仅提供了一种新的技术路径来处理复杂的时间序列数据,还推动了多领域多变量时间序列应用的创新。文档中的代码示例和详细的模型描述有助于读者快速理解和复现该项目,促进学术和技术交流。建议读者在实践中结合自己的数据集进行调试和优化,以达到最佳的预测效果。
<think>好的,用户之前已经询问过CMake是什么,现在他们想了解CMakeMSVCMinGW的区别。我需要确保回答清晰,区分这三个工具的不同角色,同时说明它们如何协同工作。 首先,CMake是一个构建系统生成器,而MSVCMinGW是编译器工具链。用户可能混淆了它们的功能,需要明确各自的职责。CMake不直接编译代码,而是生成项目文件供其他构建工具使用。而MSVCMinGW是实际的编译器,分别来自微软和MinGW项目。 接下来,我需要详细解释每个工具的作用。CMake用于跨平台配置,MSVC是Windows原生的编译环境,而MinGW则允许在Windows上使用GCC。可能需要比较它们的编译器、平台支持、许可证等。 用户可能是在选择开发工具时遇到困惑,例如在Windows环境下应该用哪个编译器,或者如何结合CMake使用。因此,我应该给出使用场景的建议,比如开发跨平台项目时用CMake配合MinGW,或者需要深度集成Windows功能时用MSVC。 还要注意回答结构,确保每个部分都有明确的标题,例如功能定位、详细对比、协同工作示例和使用场景建议。使用表格和代码示例可以增加可读性,但用户要求用中文,所以需要适当调整格式。 需要避免技术术语过于复杂,让用户容易理解。例如,解释MSVC是Visual Studio的一部分,而MinGW是GNU工具链的移植。同时,提到CMake如何生成不同的构建文件,如MSVC的.sln或MinGW的Makefile。 最后,总结部分要简明扼要,帮助用户根据项目需求选择合适的工具组合。可能用户需要开发跨平台应用,或者需要在Windows上获得更好的性能,这时候不同的工具组合会更合适。</think>以下是关于CMakeMSVCMinGW的详细对比分析: --- ### **1. 核心定位对比** | 工具 | 类型 | 核心作用 | 隶属关系 | |-----------|-----------------------|----------------------------------|---------------------| | **CMake** | 构建系统生成器 | 生成不同平台构建脚本(Makefile/.sln等) | 开源独立项目 | | **MSVC** | 编译器工具链 | Windows原生C/C++编译 | 微软Visual Studio套件 | | **MinGW** | 编译器工具链 | Windows平台GNU工具链移植 | GNU项目分支 | --- ### **2. 功能特性对比** #### **2.1 编译能力** ```text MSVC: - 专为Windows优化,支持最新C++标准 - 深度集成Windows API和SDK - 生成PE格式可执行文件 MinGW: - 基于GCC的Windows移植版 - 支持生成原生Windows程序(无Cygwin依赖) - 生成PE格式或交叉编译其他系统程序 CMake: - 不直接参与编译,负责生成构建指令 - 可同时支持MSVC/MinGW/Clang等工具链 ``` #### **2.2 平台支持** | 工具 | Windows | Linux | macOS | 跨平台编译 | |-----------|---------|-------|-------|----------| | CMake | ✔ | ✔ | ✔ | ✔ | | MSVC | ✔ | ❌ | ❌ | ❌ | | MinGW | ✔ | ❌ | ❌ | ✔ | --- ### **3. 典型工作流程** #### **3.1 使用CMake驱动不同编译器** ```mermaid graph TB A[源代码] --> B{CMake配置} B -->|生成MSVC工程| C[MSVC编译] B -->|生成MinGW Makefile| D[MinGW编译] C --> E[Windows原生exe] D --> E ``` #### **3.2 命令行示例对比** ```bash # 使用MSVC工具链 cmake -G "Visual Studio 17 2022" -A x64 .. msbuild MyProject.sln # 使用MinGW工具链 cmake -G "MinGW Makefiles" .. mingw32-make ``` --- ### **4. 关键差异详解** #### **4.1 二进制兼容性** - **MSVC**: 使用MSVCRT运行时库,与其他编译器生成的对象文件不兼容 ```cpp // 导出符号差异示例 __declspec(dllexport) void func(); // MSVC特有语法 ``` - **MinGW**: 使用GCC的libstdc++,可与Linux程序保持更高兼容性 ```cpp __attribute__((dllexport)) void func(); // MinGW/GNU语法 ``` #### **4.2 调试信息格式** | 编译器 | 调试格式 | 兼容工具 | |--------|----------------|----------------------| | MSVC | PDB | Visual Studio调试器 | | MinGW | DWARF | GDB调试器 | --- ### **5. 性能对比** | 指标 | MSVC优势场景 | MinGW优势场景 | |-------------|---------------------------|-------------------------| | 编译速度 | 大型项目增量编译更快 | 小型项目全量编译更快 | | 代码优化 | 对Windows特有优化更深入 | 标准算法优化更通用 | | 内存占用 | 需要更多系统资源 | 相对轻量 | --- ### **6. 许可证对比** | 工具 | 许可证类型 | 商业使用限制 | |-----------|--------------|--------------| | CMake | BSD-3-Clause | 无限制 | | MSVC | 专有许可证 | 需Visual Studio授权 | | MinGW | GPL | 需遵守传染性条款 | --- ### **7. 典型协同工作示例** #### **7.1 交叉编译配置** ```cmake # 强制指定MinGW工具链 set(CMAKE_C_COMPILER "x86_64-w64-mingw32-gcc") set(CMAKE_CXX_COMPILER "x86_64-w64-mingw32-g++") # 或选择MSVC工具链 set(CMAKE_GENERATOR "Visual Studio 17 2022") ``` #### **7.2 条件编译处理** ```cmake if(MSVC) add_compile_definitions(USE_MSVC=1) target_compile_options(app PRIVATE /W4) elseif(MINGW) add_compile_definitions(USE_MINGW=1) target_compile_options(app PRIVATE -Wall -Wextra) endif() ``` --- ### **8. 选择建议** #### **使用MSVC优先场景** 1. 深度依赖DirectX/WinRT等微软技术栈 2. 需要与.NET生态集成 3. 使用Visual Studio进行调试 #### **使用MinGW优先场景** 1. 需要保持Linux/Windows代码一致性 2. 使用开源工具链(GDB等) 3. 生成静态链接的独立可执行文件 #### **CMake必选场景** 1. 需要同时支持多平台编译 2. 管理复杂项目依赖关系 3. 实现持续集成自动化构建 --- ### **总结对比表** | 维度 | CMake | MSVC | MinGW | |------------|------------------------|------------------------|------------------------| | **核心作用** | 构建系统生成器 | Windows原生编译器 | GNU工具链Windows移植 | | **输出类型** | 构建脚本/工程文件 | .exe/.dll/.lib | .exe/.a/.dll | | **典型文件** | CMakeLists.txt | .vcxproj/.sln | .o/.a | | **强项** | 跨平台配置管理 | Windows深度优化 | 跨平台兼容性 | | **弱点** | 不直接编译代码 | 仅限于Windows平台 | 调试工具链较弱 | 通过合理组合使用: - **CMake + MSVC** = 专业Windows开发环境 - **CMake + MinGW** = 跨平台开发解决方案 - **CMake + 两者共存** = 实现多配置持续集成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值