qmake2cmake通过 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
在项目根目录执行以下命令,自动转换 .pro 文件为 CMakeLists.txt:
qmake2cmake_all ./ --min-qt-version 6.3 # 指定最低Qt版本
参数说明:
--min-qt-version: 指定项目依赖的最低 Qt 版本(如 6.3)。--force: 强制覆盖已存在的 CMakeLists.txt。CMakeLists.txtQMake (.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) |
添加源文件 |
QMake:
win32 {
LIBS += -ladvapi32
}
CMake:
if(WIN32)
target_link_libraries(app PRIVATE advapi32)
endif() # 参考
find_package(Qt6 COMPONENTS Core Widgets REQUIRED) # 查找Qt模块
target_link_libraries(app PRIVATE Qt6::Core Qt6::Widgets) # 链接目标库,参考
项目根目录/
├── CMakeLists.txt # 主配置文件(自动生成)
├── CMakeLists.txt.user # 用户配置缓存(可忽略)
└── src/ # 源代码目录
└── CMakeLists.txt # 子目录配置(若有)
| 操作 | QMake | CMake |
|---|---|---|
| 生成构建系统 | qmake |
cmake -B build |
| 编译 | make 或 nmake |
cmake --build build |
检查生成文件
自动生成的 CMakeLists.txt 可能需要手动补充依赖项(如第三方库)。
路径处理
QMake 的 $$PWD 需替换为 CMake 的 ${CMAKE_CURRENT_SOURCE_DIR},例如:
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # 参考
Qt版本兼容性
若项目使用 Qt5,需修改 find_package(Qt5 COMPONENTS ...) 并链接 Qt5::Core。
myapp.pro)QT += core gui
TARGET = myapp
SOURCES += main.cpp
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 是一款用于将 Visual Studio 项目(.sln/.vcxproj)转换为 CMake 项目 的自动化工具,支持跨平台构建配置迁移。
适用场景:
通过 Python 的 pip 安装(需 Python 3.6+):
pip install proj2cmake
验证安装:
proj2cmake --version # 输出版本号,如 1.2.0
.sln 文件)# 转换 .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 输出目录(默认生成在项目同级目录)参考:
原项目目录/
├── MyProject.vcxproj
└── cmake-build/ # 输出目录
├── CMakeLists.txt # 主构建脚本
├── src/ # 源代码目录
└── include/ # 头文件目录
在生成的 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 设置宏定义cmake -B build -S cmake-build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release
CMakeLists.txt 中添加缺失规则原因:Windows 系统默认编码为 GBK, CMake 使用 UTF-8
解决:避免在路径中使用中文字符,或设置环境变量:
set PYTHONIOENCODING=utf-8
proj2cmake convert ...