通过CMake在windows/linux编译跨平台项目

本文介绍了在跨平台开发中,CMake是不错的选择。详细说明了在CentOS环境下安装CMake的步骤,解释了CMake的概念,对比了make与gmake,还阐述了在Linux CentOS下使用CMake编译项目的方法,包括生成中间文件和makefile文件等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

在进行跨平台的时候,CMake无疑是一个好的选择,在“windows调试,linux运行”是高效的开发方式。
下面在centos环境下安装方式

安装CMake

安装之前,请安装GCC
centos安装cmake

  1. yum -y install gcc gcc-c++ make wget 安装必须的环境,如已安装,跳过此步骤
  2. wget -c http://www.cmake.org/files/v3.7/cmake-3.7.0.tar.gz下载cmake源码包
  3. tar -zxvf cmake-3.12.0-rc1.tar.gz && cd cmake-3.12.0-rc1解压并且进入目录
  4. ./bootstrap运行当前目录下的一个文件
  5. gmake && gmake install运行并安装
  6. cmake --version查看cmake版本号,阅读install_manifest.txt查看具体都安装了什么

在这里插入图片描述

cmake 是什么

CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。
CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))

通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程

ps : 其实cmake 的本质不是编译项目,而是打包工程,你想想你cmake . 后是不是还要 make 一下
make 才是编译
windows 上也是如此 你打包了一个 sln 解决方案,最后是不是还是要用vs的编译器来生成.exe

make与gmake

gmake是GNU Make的缩写

linux系统环境下的make就是gmake,之所以有gamke,是因为在别的平台上,make一般被占用。

  • gmake 调用的c编译器是gcc,c++编译器g++
  • make 调用的c编译器是cc,c++编译器CC

ps : 这快有个编译小技巧,
gmake -j n
n 是指开几个进程进行编译,充分利用cpu,这个命令编译时速度非常快

Linux centos 下cmake编译项目

cmake 指向CMakeLists.txt所在的目录
cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译

mkdir build
cd build
cmake ..
make

├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.2.2
│ │ │ ├── CMakeCCompiler.cmake
│ │ │ ├── CMakeCXXCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ ├── CompilerIdC
│ │ │ │ ├── a.out
│ │ │ │ └── CMakeCCompilerId.c
│ │ │ └── CompilerIdCXX
│ │ │ ├── a.out
│ │ │ └── CMakeCXXCompilerId.cpp
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeOutput.log
│ │ ├── CMakeTmp
│ │ ├── feature_tests.bin
│ │ ├── feature_tests.c
│ │ ├── feature_tests.cxx
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── progress.marks
│ │ ├── TargetDirectories.txt
│ │ └── test_sqrt.dir
│ │ ├── build.make
│ │ ├── C.includecache
│ │ ├── cmake_clean.cmake
│ │ ├── DependInfo.cmake
│ │ ├── depend.internal
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── link.txt
│ │ ├── progress.make
│ │ └── src
│ │ ├── b.c.o
│ │ └── main.c.o
│ ├── cmake_install.cmake
│ ├── Makefile
│ └── test_sqrt
├── CMakeLists.txt
├── include
│ └── b.h
└── src
├── b.c
└── main.c

<think>我们正在使用CMake配置一个跨平台WindowsLinux、macOS)的Qt6项目。根据引用[1],Qt6已经全面转向CMake作为构建系统,这为跨平台开发提供了便利。以下将详细说明配置步骤和注意事项。 ### 跨平台CMake配置Qt6项目的关键步骤 #### 1. **环境准备** - **Windows**: 安装Qt for Windows(如使用在线安装器选择MSVC或MinGW版本)和对应CMake。注意:如果使用MSVC,需要安装Visual Studio;若使用MinGW,则需安装MinGW并配置环境变量。 - **Linux**: 通过包管理器安装Qt6和CMake(如Ubuntu: `sudo apt install qt6-base-dev cmake`)。 - **macOS**: 使用Homebrew安装:`brew install qt cmake` 或从Qt官网下载安装包[^3]。 验证安装: ```bash cmake --version # 要求3.16+ qmake --version # 应为Qt6版本 ``` #### 2. **项目结构(示例)** ``` MyApp/ ├── CMakeLists.txt ├── src/ │ ├── main.cpp │ └── mainwindow.cpp ├── include/ │ └── mainwindow.h └── resources/ └── icons.qrc ``` #### 3. **核心CMakeLists.txt配置(跨平台关键点)** ```cmake cmake_minimum_required(VERSION 3.16) project(MyApp VERSION 1.0 LANGUAGES CXX) # 设置C++标准(Qt6要求C++17) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 自动处理Qt的元对象编译(moc)、资源(rcc)和界面(uic) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) # 根据平台设置输出路径(可选) if(WIN32) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) else() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) endif() # 查找Qt6组件(跨平台通用) find_package(Qt6 REQUIRED COMPONENTS Core Widgets) # 按需添加模块 # 添加可执行文件 add_executable(MyApp src/main.cpp src/mainwindow.cpp include/mainwindow.h resources/icons.qrc # 资源文件直接加入 ) # 链接Qt库 target_link_libraries(MyApp PRIVATE Qt6::Core Qt6::Widgets ) # 包含头文件目录 target_include_directories(MyApp PRIVATE include) ``` #### 4. **跨平台构建命令** - **Windows (MSVC)**: ```powershell cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_PREFIX_PATH="C:/Qt/6.4.0/msvc2019_64/lib/cmake" .. cmake --build . --config Release ``` - **Windows (MinGW)**: ```bash cmake -G "MinGW Makefiles" -DCMAKE_PREFIX_PATH="C:/Qt/6.4.0/mingw_64/lib/cmake" .. cmake --build . ``` - **Linux/macOS**: ```bash cmake .. -DCMAKE_PREFIX_PATH="/opt/Qt/6.4.0/gcc_64/lib/cmake" # Linux示例路径 # macOS若使用Homebrew安装的Qt,路径通常为:/usr/local/opt/qt/lib/cmake cmake --build . ``` #### 5. **跨平台注意事项** 1. **路径分隔符**: CMake中路径使用`/`(正斜杠)可跨平台兼容,避免使用`\`。 2. **动态库加载**: - Windows:运行时需将Qt的`bin`目录加入`PATH`(或复制dll到可执行文件目录)。 - macOS:使用`macdeployqt`打包.app时自动处理依赖。 - Linux:确保LD_LIBRARY_PATH包含Qt库路径,或使用rpath设置: ```cmake set(CMAKE_INSTALL_RPATH "$ORIGIN") ``` 3. **资源文件路径**: 在代码中访问资源文件(如图标)时,使用`:/`前缀(如`QIcon(":/icon.png")`),CMake通过`qt_add_resources`(或直接包含.qrc)自动处理。 4. **平台特定代码**: 如需平台相关代码,使用CMake条件判断: ```cmake if(WIN32) target_sources(MyApp PRIVATE windows_utils.cpp) elseif(APPLE) target_sources(MyApp PRIVATE mac_utils.mm) # .mm为Objective-C++文件 endif() ``` #### 6. **部署工具** - **Windows**:使用`windeployqt`(位于`<Qt路径>/bin`)自动复制依赖库。 - **macOS**:使用`macdeployqt`打包.app。 - **Linux**:可编写安装脚本,或使用`linuxdeployqt`。 ### 常见问题解决 - **CMake找不到Qt6**: 通过`-DCMAKE_PREFIX_PATH`显式指定Qt的CMake目录(如`/opt/Qt/6.4.0/gcc_64/lib/cmake`)。此路径下应包含`Qt6Config.cmake`[^2]。 - **macOS权限问题**: 若使用Homebrew安装Qt,确保CMake有权限读取Qt目录。可尝试: ```bash sudo chmod -R a+r /usr/local/opt/qt ``` - **Linux缺少OpenGL库**: 安装开发包:Ubuntu下`sudo apt install libgl1-mesa-dev`。 ### 进阶配置 - **添加翻译文件**: 使用`qt_add_translations`目标: ```cmake qt_add_translations(MyApp TS_FILES translations/app_zh_CN.ts translations/app_fr_FR.ts ) ``` - **Qt Quick应用**: 引入`Quick`组件并启用QML模块: ```cmake find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(MyApp PRIVATE Qt6::Quick) ``` ### 总结 通过CMake配置Qt6项目可实现无缝跨平台编译,关键在于: 1. 正确设置`CMAKE_PREFIX_PATH`指向Qt安装路径。 2. 使用`find_package`加载所需Qt模块。 3. 启用`AUTOMOC`、`AUTORCC`、`AUTOUIC`简化元编译流程。 4. 遵循平台特定的构建和部署规则。 > 提示:更多跨平台细节参考Qt官方文档[^1]。 --- ### 相关问题 1. 如何在CMake项目中为Qt6应用程序添加国际化支持(多语言翻译)? 2. 如何配置CMake以在Qt6项目中同时使用Qt Widgets和Qt Quick? 3. 在Windows上使用MinGW构建Qt6项目时遇到链接错误如何解决? 4. macOS下如何将Qt6应用打包为.dmg安装文件? 5. Linux下如何解决Qt6程序运行时找不到动态库的问题? [^1]: 全面剖析Qt6新版构建系统CMake [^2]: ubuntu 使用 CMake 构建 Qt5 项目 [^3]: 尝试mac下编译qt 6.4.3</think>### 使用CMake配置Qt6实现跨平台编译Windows/Linux/macOS) 以下是完整的跨平台配置指南,已整合引用内容的关键信息: #### 1. **基础CMake配置(跨平台核心)** ```cmake cmake_minimum_required(VERSION 3.18) # Qt6要求最低3.16,推荐3.18+[^1][^3] project(MyQtApp VERSION 1.0 LANGUAGES CXX) # 设置C++标准(Qt6需要C++17) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 启用Qt自动处理(关键跨平台特性) set(CMAKE_AUTOMOC ON) # 自动运行moc set(CMAKE_AUTORCC ON) # 自动处理资源文件 set(CMAKE_AUTOUIC ON) # 自动运行uic[^2] # 查找Qt6组件(跨平台通用) find_package(Qt6 REQUIRED COMPONENTS Core Widgets) ``` #### 2. **平台特定处理** ```cmake # Windows特殊配置 if(WIN32) # 设置MSVC运行时库(避免MT/MTd冲突) if(MSVC) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL") endif() # 资源文件路径处理 set(QT_RESOURCES_PREFIX "/resources") endif() # macOS特殊配置 if(APPLE) # 设置Bundle标识符 set(MACOSX_BUNDLE_BUNDLE_NAME "MyQtApp") set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.example.myapp") # 解决macOS权限问题 set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks") endif() # Linux特殊配置 if(UNIX AND NOT APPLE) # 设置安装路径 set(CMAKE_INSTALL_PREFIX "/usr/local") endif() ``` #### 3. **可执行文件配置** ```cmake # 添加可执行文件(跨平台) add_executable(MyQtApp src/main.cpp src/MainWindow.cpp include/MainWindow.h resources/app.qrc # 资源文件直接包含 ) # 链接Qt库(跨平台通用) target_link_libraries(MyQtApp PRIVATE Qt6::Core Qt6::Widgets ) # 包含头文件目录 target_include_directories(MyQtApp PRIVATE include) ``` #### 4. **跨平台构建命令** ```bash # 通用生成命令(各平台通用) cmake -B build -DCMAKE_PREFIX_PATH="<Qt安装路径>/lib/cmake" # 平台特定生成器(按需选择) # Windows (MSVC): cmake -B build -G "Visual Studio 17 2022" -A x64 # Windows (MinGW): cmake -B build -G "MinGW Makefiles" # Linux/macOS: cmake -B build # 编译命令(跨平台通用) cmake --build build ``` #### 5. **关键跨平台技巧 1. **Qt路径配置**: - 使用`-DCMAKE_PREFIX_PATH`指定Qt安装路径: ```bash # Windows示例 -DCMAKE_PREFIX_PATH="C:/Qt/6.4.0/msvc2019_64/lib/cmake" # macOS (Homebrew) -DCMAKE_PREFIX_PATH="/opt/homebrew/opt/qt/lib/cmake" # Linux -DCMAKE_PREFIX_PATH="/opt/Qt/6.4.0/gcc_64/lib/cmake" ``` 2. **资源文件处理**: ```cmake # 跨平台资源路径处理 qt_add_resources(MyQtApp "app_resources" PREFIX ":/" FILES resources/icons/app_icon.png resources/styles/style.css ) ``` 3. **依赖管理**: - Windows:使用`windeployqt`打包依赖 - macOS:使用`macdeployqt`打包.app - Linux:使用`linuxdeployqt`或设置RPATH #### 6. **完整示例结构 ``` MyQtApp/ ├── CMakeLists.txt # 主配置文件 ├── src/ │ ├── main.cpp # 主入口 │ └── MainWindow.cpp # 业务逻辑 ├── include/ │ └── MainWindow.h # 头文件 ├── resources/ │ ├── app.qrc # 资源文件 │ └── icons/ # 图标资源 └── CMakePresets.json # 跨平台预设(可选) ``` #### 7. **验证与调试 ```cmake # 添加跨平台验证目标 add_custom_target(verify-qt6 COMMAND ${Qt6_DIR}/Qt6Config.cmake --version COMMENT "验证Qt6配置: ${Qt6_DIR}" ) ``` > 提示:根据Qt官方说明,迁移到CMake的主要目标是简化跨平台集成[^1]。在macOS编译需注意安装C++17兼容编译器和Python依赖[^3]。 --- ### 相关问题 1. 如何在CMake中为Qt6项目配置多语言翻译文件(.ts)? 2. Windows平台使用MinGW构建Qt6时如何解决链接错误? 3. macOS下如何将Qt6应用打包为.dmg安装文件? 4. 如何在CMake中配置Qt6和Qt5的兼容模式? 5. Linux下如何解决Qt6程序运行时找不到动态库的问题? [^1]: 全面剖析Qt6新版构建系统CMake [^2]: ubuntu 使用 CMake 构建 Qt5 项目 [^3]: 尝试mac下编译qt 6.4.3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值