cmake常用语法

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.关联链接

链接OpenGL库错误问题处理链接

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项目。以下是对其结构的详细解析:

  1. CMake版本要求
cmake_minimum_required(VERSION 3.14)

要求CMake最低版本为3.14,确保支持后续使用的功能。

  1. 项目定义
project(untitled3 LANGUAGES CXX)

定义项目名称为untitled3,使用C++语言。

  1. Qt自动处理设置

set(CMAKE_AUTOUIC ON) # 自动生成UI头文件
set(CMAKE_AUTOMOC ON) # 自动处理元对象编译
set(CMAKE_AUTORCC ON) # 自动处理资源文件

这些设置简化了Qt项目的构建流程,但当前项目未包含.ui.qrc文件,因此暂时不会生效。

  1. C++标准设置

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

强制使用C++17标准,确保编译时启用相关特性。

  1. 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模块
  1. 可执行文件定义

add_executable(untitled3 main.cpp)
target_link_libraries(untitled3 Qt${QT_VERSION_MAJOR}::Core)
  • 编译生成名为untitled3的可执行文件
  • 链接到对应Qt版本的Core库(如Qt5::Core或Qt6::Core)
  1. 安装配置

include(GNUInstallDirs)
install(TARGETS untitled3
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
  • 包含标准安装路径定义
  • 将可执行文件安装到bin目录(RUNTIME),但存在冗余的LIBRARY参数(适用于动态库)

潜在改进建议

  1. 简化Qt查找逻辑:

find_package(Qt6 COMPONENTS Core REQUIRED) # 直接指定所需版本

  1. 修正安装路径:

install(TARGETS untitled3
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}  # 仅保留可执行文件安装
)
  1. 添加版本兼容性检查(可选):

if(QT_VERSION_MAJOR VERSION_LESS 6)
    # Qt5专用配置
else()
    # Qt6专用配置
endif()

典型项目结构

项目根目录/
├── CMakeLists.txt
└── main.cpp

该配置适用于需要Qt Core基础功能(如信号槽、文件操作等)的控制台应用程序。如需GUI功能,需添加Widgets组件并包含相关头文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值