附录1 从 QMake 迁移到 CMake 详细记录.md 8.4 KB

从 QMake 迁移到 CMake 详细教程

qmake2cmake 使用

一、工具准备:qmake2cmake

1. 安装转换工具

通过 Python 的 pip 安装官方转换工具 qmake2cmake

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

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:

win32 {
    LIBS += -ladvapi32
}

CMake:

if(WIN32)
    target_link_libraries(app PRIVATE advapi32)
endif()  # 参考

3. 链接库配置

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
编译 makenmake cmake --build build

四、注意事项

  1. 检查生成文件
    自动生成的 CMakeLists.txt 可能需要手动补充依赖项(如第三方库)。

  2. 路径处理
    QMake 的 $$PWD 需替换为 CMake 的 ${CMAKE_CURRENT_SOURCE_DIR},例如:

    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)  # 参考
    
  3. Qt版本兼容性
    若项目使用 Qt5,需修改 find_package(Qt5 COMPONENTS ...) 并链接 Qt5::Core


五、完整示例

QMake 项目文件(myapp.pro

QT += core gui
TARGET = myapp
SOURCES += main.cpp

转换后的 CMakeLists.txt

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)  # 参考

参考资料

proj2cmake 使用


一、工具简介

proj2cmake 是一款用于将 Visual Studio 项目(.sln/.vcxproj)转换为 CMake 项目 的自动化工具,支持跨平台构建配置迁移。
适用场景:

  • 从 Visual Studio 迁移到跨平台 CMake 构建
  • 简化旧版 VS 项目的维护
  • 集成 CI/CD 自动化流程

二、安装与配置

1. 安装 proj2cmake

通过 Python 的 pip 安装(需 Python 3.6+):

pip install proj2cmake

验证安装:

proj2cmake --version  # 输出版本号,如 1.2.0

 

2. 环境要求

  • CMake 3.14+(推荐 3.21+)
  • Visual Studio 2017+(如需解析 .sln 文件)

三、基础用法

1. 转换单个项目

# 转换 .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. 转换后目录结构

原项目目录/
├── MyProject.vcxproj
└── cmake-build/          # 输出目录
    ├── CMakeLists.txt    # 主构建脚本
    ├── src/              # 源代码目录
    └── include/          # 头文件目录

四、高级配置

1. 自定义 CMake 规则

在生成的 CMakeLists.txt 中补充配置(如添加库依赖、编译选项):

# 示例:添加 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. 生成构建系统

cmake -B build -S cmake-build -DCMAKE_BUILD_TYPE=Release

2. 编译项目

cmake --build build --config Release

六、常见问题

1. 错误:无法解析 .sln 文件

  • 原因:Visual Studio 版本不兼容或解决方案文件损坏
  • 解决:使用 VS 2019+ 打开并保存解决方案,确保文件无错误

2. 警告:部分配置未转换

  • 原因:proj2cmake 不支持某些高级 VS 特性(如自定义生成工具)
  • 解决:手动在 CMakeLists.txt 中添加缺失规则

3. 中文路径乱码

  • 原因:Windows 系统默认编码为 GBK, CMake 使用 UTF-8

  • 解决:避免在路径中使用中文字符,或设置环境变量:

    set PYTHONIOENCODING=utf-8
    proj2cmake convert ...
    

七、参考资料

  • proj2cmake 工具功能说明
  • 命令行参数与转换示例
  • CMake 中集成第三方库的方法
  • Visual Studio 与 CMake 兼容性注意事项