# 从 QMake 迁移到 CMake 详细教程 # qmake2cmake 使用 ## 一、工具准备:`qmake2cmake` ### 1\. 安装转换工具 通过 Python 的 `pip` 安装官方转换工具 `qmake2cmake`: ```bash python -m pip install qmake2cmake # 参考 ``` qmake2cmake --help ``` 使用方法:qmake2cmake [-h] [--min-qt-version MIN_QT_VERSION] [--debug] [--debug-parser] [--debug-parse-result] [--debug-parse-dictionary] [--debug-pro-structure] [--debug-full-pro-structure] [--debug-special-case-preservation] [-s] [-k] [-e] [--skip-subdirs-project] [-i] [-o OUTPUT_FILE] <.pro/.pri 文件> [<.pro/.pri 文件> ...] 从 .pro 文件生成 CMakeLists.txt 文件。 位置参数: <.pro/.pri 文件> 要处理的 .pro/.pri 文件 选项: -h, --help 显示此帮助信息并退出 --min-qt-version MIN_QT_VERSION 指定转换后的项目的最低 Qt 版本。 --debug 启用所有调试输出 --debug-parser 打印来自 qmake 解析器的调试输出。 --debug-parse-result 转储 qmake 解析器的结果。 --debug-parse-dictionary 将 qmake 解析器的结果转储为字典。 --debug-pro-structure 转储 qmake .pro 文件的结构。 --debug-full-pro-structure 转储 qmake .pro 文件的完整结构(包含 include 文件)。 --debug-special-case-preservation 显示所有 git 命令和文件复制操作。 -s, --enable-special-case-preservation 启用特殊情况修改(需要在 PATH 中包含 git)。 -k, --keep-temporary-files 不要自动删除 CMakeLists.gen.txt 和其他中间文件。 仅在启用特殊情况保留时相关。 -e, --skip-condition-cache 不要使用条件简化器缓存(转换速度可能会降低)。 --skip-subdirs-project 如果项目最终成为 TEMPLATE=subdirs 项目,则跳过转换。 -i, --ignore-skip-marker 如果设置,即使在 CMakeLists.txt 中找到跳过标记,也会转换 pro 文件。 -o OUTPUT_FILE, --output-file OUTPUT_FILE 指定生成内容的写入文件路径。 默认是写入与 .pro 文件位于同一目录的 CMakeLists.txt 文件。 要求: pip install -r requirements.txt ``` ### 2\. 转换命令 在项目根目录执行以下命令,自动转换 `.pro` 文件为 `CMakeLists.txt`: ```bash qmake2cmake_all ./ --min-qt-version 6.3 # 指定最低Qt版本 ``` **参数说明**: - `--min-qt-version`: 指定项目依赖的最低 Qt 版本(如 6.3)。 - `--force`: 强制覆盖已存在的 `CMakeLists.txt`。 --- ## 二、手动调整 `CMakeLists.txt` ### 1\. 基础配置对比 | QMake (`.pro`) | CMake (`CMakeLists.txt`) | 说明 | | --------------------- | --------------------------------------- | ------------------ | | `QT += core gui` | `find_package(Qt6 COMPONENTS Core Gui)` | 需显式查找包,参考 | | `CONFIG += c++11` | `set(CMAKE_CXX_STANDARD 11)` | 设置C++标准,参考 | | `SOURCES += main.cpp` | `add_executable(app main.cpp)` | 添加源文件 | ### 2\. 条件编译处理 **QMake**: ```qmake win32 { LIBS += -ladvapi32 } ``` **CMake**: ```cmake if(WIN32) target_link_libraries(app PRIVATE advapi32) endif() # 参考 ``` ### 3\. 链接库配置 ```cmake find_package(Qt6 COMPONENTS Core Widgets REQUIRED) # 查找Qt模块 target_link_libraries(app PRIVATE Qt6::Core Qt6::Widgets) # 链接目标库,参考 ``` --- ## 三、关键步骤详解 ### 1\. 转换后文件结构 ``` 项目根目录/ ├── CMakeLists.txt # 主配置文件(自动生成) ├── CMakeLists.txt.user # 用户配置缓存(可忽略) └── src/ # 源代码目录 └── CMakeLists.txt # 子目录配置(若有) ``` ### 2\. 构建命令对比 | 操作 | QMake | CMake | | ------------ | ----------------- | --------------------- | | 生成构建系统 | `qmake` | `cmake -B build` | | 编译 | `make` 或 `nmake` | `cmake --build build` | --- ## 四、注意事项 1. **检查生成文件** 自动生成的 `CMakeLists.txt` 可能需要手动补充依赖项(如第三方库)。 2. **路径处理** QMake 的 `$$PWD` 需替换为 CMake 的 `${CMAKE_CURRENT_SOURCE_DIR}`,例如: ```cmake include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # 参考 ``` 3. **Qt版本兼容性** 若项目使用 Qt5,需修改 `find_package(Qt5 COMPONENTS ...)` 并链接 `Qt5::Core`。 --- ## 五、完整示例 ### QMake 项目文件(`myapp.pro`) ```qmake QT += core gui TARGET = myapp SOURCES += main.cpp ``` ### 转换后的 CMakeLists.txt ```cmake cmake_minimum_required(VERSION 3.16) project(myapp LANGUAGES CXX) find_package(Qt6 COMPONENTS Core Gui REQUIRED) # 参考 add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE Qt6::Core Qt6::Gui) # 参考 ``` --- ## 参考资料 - [QMake与CMake配置文件对比](https://zhuanlan.zhihu.com/p/751292404) - [显式依赖处理与编译器标志](https://blog.csdn.net/xxzhaoming/article/details/140024090) - [qmake2cmake工具使用指南](https://blog.csdn.net/TemetNosce/article/details/128957173) - [CMake命令手册](https://cloud.baidu.com/article/3282148) # proj2cmake 使用 --- ## 一、工具简介 `proj2cmake` 是一款用于将 **Visual Studio 项目(.sln/.vcxproj)转换为 CMake 项目** 的自动化工具,支持跨平台构建配置迁移。 适用场景: - 从 Visual Studio 迁移到跨平台 CMake 构建 - 简化旧版 VS 项目的维护 - 集成 CI/CD 自动化流程 --- ## 二、安装与配置 ### 1\. 安装 proj2cmake 通过 Python 的 `pip` 安装(需 Python 3.6+): ```bash pip install proj2cmake ``` 验证安装: ```bash proj2cmake --version # 输出版本号,如 1.2.0 ```   ### 2\. 环境要求 - **CMake 3.14+**(推荐 3.21+) - **Visual Studio 2017+**(如需解析 `.sln` 文件) --- ## 三、基础用法 ### 1\. 转换单个项目 ```bash # 转换 .vcxproj 文件 proj2cmake convert "path/to/MyProject.vcxproj" --output-dir cmake-build # 转换整个解决方案 (.sln) proj2cmake convert "path/to/MySolution.sln" --recursive --output-dir cmake-build ``` 参数说明: - `--recursive`:递归转换解决方案内所有子项目 - `--output-dir`:指定 CMake 输出目录(默认生成在项目同级目录) 参考: ### 2\. 转换后目录结构 ```text 原项目目录/ ├── MyProject.vcxproj └── cmake-build/ # 输出目录 ├── CMakeLists.txt # 主构建脚本 ├── src/ # 源代码目录 └── include/ # 头文件目录 ``` --- ## 四、高级配置 ### 1\. 自定义 CMake 规则 在生成的 `CMakeLists.txt` 中补充配置(如添加库依赖、编译选项): ```cmake # 示例:添加 C++17 标准支持 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 示例:链接第三方库 find_package(OpenCV REQUIRED) target_link_libraries(MyProject PRIVATE OpenCV::OpenCV) ``` 2\. 处理复杂项目 若项目包含 **自定义生成事件** 或 **复杂预处理器定义**,需手动调整生成的 CMake 脚本: - 使用 `add_custom_command` 添加自定义构建步骤 - 通过 `target_compile_definitions` 设置宏定义 --- ## 五、验证与构建 ### 1\. 生成构建系统 ```bash cmake -B build -S cmake-build -DCMAKE_BUILD_TYPE=Release ``` ### 2\. 编译项目 ```bash cmake --build build --config Release ``` --- ## 六、常见问题 ### 1\. **错误:无法解析 .sln 文件** - **原因**:Visual Studio 版本不兼容或解决方案文件损坏 - **解决**:使用 VS 2019+ 打开并保存解决方案,确保文件无错误 ### 2\. **警告:部分配置未转换** - **原因**:proj2cmake 不支持某些高级 VS 特性(如自定义生成工具) - **解决**:手动在 `CMakeLists.txt` 中添加缺失规则 ### 3\. **中文路径乱码** - **原因**:Windows 系统默认编码为 GBK, CMake 使用 UTF-8 - **解决**:避免在路径中使用中文字符,或设置环境变量: ```bash set PYTHONIOENCODING=utf-8 proj2cmake convert ... ``` --- ## 七、参考资料 - proj2cmake 工具功能说明 - 命令行参数与转换示例 - CMake 中集成第三方库的方法 - Visual Studio 与 CMake 兼容性注意事项