当前位置: 首页 > news >正文

【CMake】CMake 常用语法总结

引言

        CMake 是一个跨平台的自动化构建系统生成工具,用于管理软件构建过程。

目录

一、基础命令

二、文件与目录管理

三、链接控制

四、编译选项控制

五、条件控制与循环

六、安装规则

七、生成配置文件

八、常用变量

九、生成器表达式(高级)

附:示例


一、基础命令

  1. 项目定义

    cmake_minimum_required(VERSION 3.10)  # 指定最低CMake版本
    project(MyProject                     # 项目名称VERSION 1.0.0                       # 项目版本LANGUAGES C CXX)                    # 使用语言(C/C++)
  2. 变量操作

    set(MY_VAR "value")                   # 定义变量
    set(SOURCES src/main.cpp src/util.cpp) # 设置文件列表
    message("Variable value: ${MY_VAR}")  # 打印变量
  3. 添加构建目标

    add_executable(my_app ${SOURCES})     # 创建可执行文件
    add_library(my_lib STATIC ${SOURCES}) # 创建静态库
    add_library(my_shared SHARED ${SOURCES}) # 创建动态库

二、文件与目录管理

  1. 包含头文件目录

    include_directories(include)          # 全局包含目录
    target_include_directories(my_lib     # 目标专属包含目录PUBLIC include                      # PUBLIC: 目标及其使用者都可见PRIVATE src                         # PRIVATE: 仅目标内部可见
    )
  2. 文件操作

    file(GLOB SOURCES "src/*.cpp")        # 通配符获取文件列表
    file(GLOB_RECURSE HEADERS "include/**/*.h") # 递归查找
  3. 添加子目录

    add_subdirectory(src)                 # 添加子目录(需有CMakeLists.txt)

三、链接控制

  1. 链接库文件

    target_link_libraries(my_app          # 链接库到可执行文件PRIVATE my_lib                      # PRIVATE: 内部依赖PUBLIC  my_shared                   # PUBLIC: 传递依赖
    )
  2. 查找系统库

    find_package(OpenCV REQUIRED)         # 查找OpenCV
    target_link_libraries(my_app PRIVATE ${OpenCV_LIBS})

四、编译选项控制

  1. 编译器标志

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O2") # 全局标志
    target_compile_options(my_app PRIVATE -fPIC) # 目标专属标志
  2. C++标准设置

    set(CMAKE_CXX_STANDARD 17)            # 全局C++标准
    set(CMAKE_CXX_STANDARD_REQUIRED ON)   # 必须支持该标准
  3. 预处理器定义

    add_definitions(-DDEBUG_MODE)         # 全局定义
    target_compile_definitions(my_app PRIVATE USE_FEATURE_X) # 目标专属

五、条件控制与循环

  1. 条件语句

    if(CMAKE_SYSTEM_NAME STREQUAL "Linux")message("Building on Linux")
    elseif(WIN32)message("Building on Windows")
    else()message("Unknown system")
    endif()
  2. 循环语句

    foreach(source ${SOURCES})message("Processing: ${source}")
    endforeach()

六、安装规则

install(TARGETS my_app                   # 安装目标RUNTIME DESTINATION bin                # 可执行文件 -> /usr/binLIBRARY DESTINATION lib                # 动态库 -> /usr/libARCHIVE DESTINATION lib/static)        # 静态库 -> /usr/lib/staticinstall(DIRECTORY include/ DESTINATION include) # 安装头文件
install(FILES README.md DESTINATION doc) # 安装单个文件

七、生成配置文件

configure_file(                         # 模板文件生成config.h.in                           # 输入模板${CMAKE_BINARY_DIR}/config.h          # 输出文件
)

八、常用变量

变量名描述
CMAKE_SOURCE_DIR源码根目录
CMAKE_BINARY_DIR构建目录 (build)
CMAKE_CURRENT_SOURCE_DIR当前处理的CMakeLists.txt所在目录
PROJECT_NAME项目名称
CMAKE_BUILD_TYPE构建类型 (Debug/Release)
CMAKE_INSTALL_PREFIX安装前缀 (/usr/local)

九、生成器表达式(高级)

target_include_directories(my_appPUBLIC$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>    # 构建时包含$<INSTALL_INTERFACE:include>                     # 安装时包含
)

附:完整示例

目录结构

demo/├── CMakeLists.txt├── main.c└── hello.c

main.c文件

#include <stdio.h>extern void hello();int main() {printf("This is main!\n");hello();return 0;
}

hello.c 文件

#include <stdio.h>void hello() {printf("%s: hello world!\n", __func__);
}

 CMakeLists.txt文件

# 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.10)# 项目名称
project(DemoProject)# 设置 C 编译标准
set(CMAKE_C_STANDARD 99)# 添加可执行文件,指定源文件
add_executable(demo main.c hello.c)

执行命令 

cd demo/
mkdir build
cd build
cmake ..
make
./demo

执行结果

raspberrypi:~/test/demo $ mkdir build
raspberrypi:~/test/demo $ cd build/
raspberrypi:~/test/demo/build $ cmake ..
-- The C compiler identification is GNU 12.2.0
-- The CXX compiler identification is GNU 12.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hjh/test/demo/build
raspberrypi:~/test/demo/build $ make
[ 33%] Building C object CMakeFiles/demo.dir/main.c.o
[ 66%] Building C object CMakeFiles/demo.dir/hello.c.o
[100%] Linking C executable demo
[100%] Built target demo
hjh@raspberrypi:~/test/demo/build $ ./demo
This is main!
hello: hello world!
raspberrypi:~/test/demo/build $

http://www.dtcms.com/a/295364.html

相关文章:

  • SSP通过SDK对接流量的原理与实现
  • SSM之表现层数据封装-统一响应格式全局异常处理
  • 主要分布在背侧海马体(dHPC)CA1区域(dCA1)的位置细胞对NLP中的深层语义分析的积极影响和启示
  • 大模型处理私有数据的核心技术
  • 《R 矩阵》
  • 基础NLP | 02 深度学习基本原理
  • Unity 多人游戏框架学习系列九
  • RocketMQ搭建及测试(Windows环境)
  • 基于深度学习的图像分类:使用MobileNet实现高效分类
  • 路径总和Ⅲ(树)C++
  • 网络编程基石:TCP 原理全解析
  • AbMole小课堂 | Nivolumab(BMS-936558):PD-1人源化单抗的作用机制与抗肿瘤应用
  • 给定一个长度为n的数组,和一个长度为w的滑动窗口,w < n, 窗口沿着数组每次滑动一个位置,求出每次滑动后,滑动窗口内的最大值。 C++实现高效代码
  • 数据库底层索引讲解-排序和数据结构
  • Ethereum: 从零到一为DApp开发搭建专属的私有测试网络
  • Compose 适配 - 键鼠模式
  • Ethereum: 从 1e+21 到千枚以太币:解密 Geth 控制台的余额查询
  • Day30| 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
  • 风险分级响应管理分析系统
  • 基于 PIC16 系列的多功能电子烟(温控 + 电压控制 + 多模式)方案
  • 亚马逊云科技 EC2 部署 Dify,集成 Amazon Bedrock 构建生成式 AI 应用
  • 【初识数据结构】CS61B 中的归并排序和选择排序
  • python学习xlsx表格导入mysql脚本 + leetcode19删除链表倒N + python与本地mysql连接不上排错
  • 每日算法-两数之和
  • Go基础教程 从零到英雄:30分钟掌握Go语言核心精髓
  • Leetcode—1035. 不相交的线【中等】
  • 独家|百度副总裁尚国斌即将离职,此前统筹百度地图;行业搜索及智能体业务总经理谢天转岗IDG
  • MongoDB 和 Elasticsearch(ES)区别
  • 项目重新发布更新缓存问题,Nginx清除缓存更新网页
  • MAC包头、IP包头 、UDP包头中的长度含义是啥?三者之间有啥区别?