1.概要
创建工程
project(MyProject) # 定义项目名称,可选指定语言(如 C/CXX)
project(MyProject LANGUAGES CXX)
add_executable
添加库
add_library(my_lib STATIC src/lib.cpp) # 静态库(.a/.lib)
add_library(my_lib SHARED src/lib.cpp) # 动态库(.so/.dll)
add_library(my_lib INTERFACE) # 接口库(无源文件,仅头文件)
头文件目录
target_include_directories(my_app
PUBLIC include/ # 目标自身和依赖它的其他目标需要
PRIVATE src/ # 仅目标自身需要
)
链接库
target_link_libraries(my_app
PRIVATE my_lib # 仅目标自身链接
PUBLIC Threads::Threads # 公共依赖(依赖者也需要)
)
生成导出项目
install(EXPORT MyProjectTargets
FILE MyProjectTargets.cmake
DESTINATION lib/cmake/MyProject
)
2.内容
CMake 是跨平台构建系统,用于管理项目的编译、链接、安装等过程。以下是 CMake 中常用的语法和命令,按功能分类整理,适合快速参考:
一、基础项目配置
1. 设置最低 CMake 版本
cmake_minimum_required(VERSION 3.10) # 指定项目所需的最低 CMake 版本
2. 定义项目
project(MyProject) # 定义项目名称,可选指定语言(如 C/CXX)
project(MyProject LANGUAGES CXX)
二、目标管理(可执行文件/库)
1. 添加可执行文件
add_executable(my_app main.cpp src/utils.cpp) # 生成可执行文件,指定源文件
2. 添加库(静态/动态)
add_library(my_lib STATIC src/lib.cpp) # 静态库(.a/.lib)
add_library(my_lib SHARED src/lib.cpp) # 动态库(.so/.dll)
add_library(my_lib INTERFACE) # 接口库(无源文件,仅头文件)
三、依赖与属性设置
1. 头文件目录
target_include_directories(my_app
PUBLIC include/ # 目标自身和依赖它的其他目标需要
PRIVATE src/ # 仅目标自身需要
)
2. 链接库
target_link_libraries(my_app
PRIVATE my_lib # 仅目标自身链接
PUBLIC Threads::Threads # 公共依赖(依赖者也需要)
)
3. 编译选项
target_compile_options(my_app
PRIVATE -Wall -Wextra # 目标自身编译选项
)
4. 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17) # 全局设置 C++17
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 必须支持该标准
target_compile_features(my_app PUBLIC cxx_std_17) # 目标级设置
四、变量与条件控制
1. 变量定义
set(MY_VAR "value") # 普通变量
set(MY_LIST a b c) # 列表变量(空格分隔)
2. 条件判断
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_options(my_app PRIVATE -g)
endif()
option(USE_OPENMP "Enable OpenMP" OFF) # 定义布尔选项
if(USE_OPENMP)
find_package(OpenMP REQUIRED)
target_link_libraries(my_app PUBLIC OpenMP::OpenMP_CXX)
endif()
五、查找依赖(第三方库)
1. 查找已安装的包
find_package(Boost 1.70 REQUIRED COMPONENTS system filesystem)
target_link_libraries(my_app PUBLIC Boost::system Boost::filesystem)
2. 手动查找文件/库
find_file(MY_HEADER my_header.h PATHS /usr/include /opt/local/include)
find_library(MY_LIB NAMES my_lib PATHS /usr/lib /opt/local/lib)
六、安装与打包
1. 安装目标(可执行文件/库)
install(TARGETS my_app my_lib
RUNTIME DESTINATION bin # 可执行文件
LIBRARY DESTINATION lib # 动态库
ARCHIVE DESTINATION lib # 静态库
)
install(DIRECTORY include/ DESTINATION include) # 安装头文件
2. 生成打包配置
set(CPACK_PACKAGE_NAME "MyProject")
set(CPACK_PACKAGE_VERSION "1.0.0")
include(CPack) # 生成安装包(.deb, .rpm, .msi 等)
七、高级用法
1. 生成导出文件(供其他项目使用)
install(EXPORT MyProjectTargets
FILE MyProjectTargets.cmake
DESTINATION lib/cmake/MyProject
)
2. 自定义命令(生成源文件)
add_custom_command(
OUTPUT generated.cpp
COMMAND python3 generate.py > generated.cpp
DEPENDS generate.py
)
add_executable(my_app main.cpp generated.cpp)
3. 处理子目录
add_subdirectory(src) # 递归处理子目录的 CMakeLists.txt
4. 生成器表达式(条件配置)
target_compile_options(my_app PRIVATE $<$<CONFIG:Debug>:-g>)
target_link_libraries(my_app PUBLIC $<$<BOOL:${USE_OPENMP}>:OpenMP::OpenMP_CXX>)
八、常用变量
CMAKE_SOURCE_DIR
:项目根目录CMAKE_BINARY_DIR
:构建目录CMAKE_INSTALL_PREFIX
:安装路径(默认/usr/local
)CMAKE_BUILD_TYPE
:构建类型(Debug/Release/RelWithDebInfo)
示例:完整 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyApp LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
option(USE_OPENMP "Enable OpenMP" OFF)
add_executable(my_app main.cpp src/utils.cpp)
target_include_directories(my_app
PUBLIC include/
PRIVATE src/
)
if(USE_OPENMP)
find_package(OpenMP REQUIRED)
target_link_libraries(my_app PUBLIC OpenMP::OpenMP_CXX)
endif()
install(TARGETS my_app DESTINATION bin)
通过以上语法,可以高效管理项目的编译、依赖和安装流程。实际使用中可根据项目需求调整配置。
3.关联链接
4.关联知识
1.工程解析举例
cmake_minimum_required(VERSION 3.14)
project(untitled3 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)
add_executable(untitled3
main.cpp
)
target_link_libraries(untitled3 Qt${QT_VERSION_MAJOR}::Core)
include(GNUInstallDirs)
install(TARGETS untitled3
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
这个CMake工程文件用于构建一个基于Qt Core模块的C++17项目。以下是对其结构的详细解析:
- CMake版本要求
cmake_minimum_required(VERSION 3.14)
要求CMake最低版本为3.14,确保支持后续使用的功能。
- 项目定义
project(untitled3 LANGUAGES CXX)
定义项目名称为untitled3
,使用C++语言。
- Qt自动处理设置
set(CMAKE_AUTOUIC ON) # 自动生成UI头文件
set(CMAKE_AUTOMOC ON) # 自动处理元对象编译
set(CMAKE_AUTORCC ON) # 自动处理资源文件
这些设置简化了Qt项目的构建流程,但当前项目未包含.ui
或.qrc
文件,因此暂时不会生效。
- C++标准设置
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
强制使用C++17标准,确保编译时启用相关特性。
- Qt依赖查找
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)
- 第一行优先查找Qt6,若未找到则回退到Qt5,并确保Core模块存在
- 第二行根据第一个命令找到的Qt主版本号(5或6)加载对应版本的Core模块
- 可执行文件定义
add_executable(untitled3 main.cpp)
target_link_libraries(untitled3 Qt${QT_VERSION_MAJOR}::Core)
- 编译生成名为
untitled3
的可执行文件 - 链接到对应Qt版本的Core库(如Qt5::Core或Qt6::Core)
- 安装配置
include(GNUInstallDirs)
install(TARGETS untitled3
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
- 包含标准安装路径定义
- 将可执行文件安装到
bin
目录(RUNTIME),但存在冗余的LIBRARY
参数(适用于动态库)
潜在改进建议:
- 简化Qt查找逻辑:
find_package(Qt6 COMPONENTS Core REQUIRED) # 直接指定所需版本
- 修正安装路径:
install(TARGETS untitled3
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # 仅保留可执行文件安装
)
- 添加版本兼容性检查(可选):
if(QT_VERSION_MAJOR VERSION_LESS 6)
# Qt5专用配置
else()
# Qt6专用配置
endif()
典型项目结构:
项目根目录/
├── CMakeLists.txt
└── main.cpp
该配置适用于需要Qt Core基础功能(如信号槽、文件操作等)的控制台应用程序。如需GUI功能,需添加Widgets
组件并包含相关头文件。