【编程技巧】如何写好CMakeList【常见命令汇总】

【编程技巧】如何写好CMakeList【常见命令汇总】

一、问题背景

开发过程中经常需要构建新的C++项目。受限于工期,往往草草从旧项目中抄一个CMakeList,要么是包含的头文件或者导入的库过多,加重了编译负担,要么就是删减过程中多删了某个头文件或者依赖的库,导致开发流水线被阻塞。所以总需要返工反复调试修改CMakeList文件。

写好一个CMakeList对于现在的我来说确实绝非易事,所以产生了以初学者的心态,重头学习的想法,目标在于:

  1. 能优雅的写好CMakeList文件,不过多添加依赖库和头文件,也不在缺乏依赖的情况下commit代码。
  2. 编译过程报错时,能迅速分析定界是代码问题还是CMakeList问题,并实施修改。

二、CMakeList常用命令

(1) project(<项目名称> [LANGUAGES <语言列表>])

用于定义项目的名称和使用的编程语言(如 C、C++、Fortran 等),其中 [LANGUAGES <语言列表>]为可选项。例如:

project(MyProject)
project(MyProject LANGUAGES C CXX)
(2)cmake_minimum_required(VERSION <版本号>)

用于指定 CMake 的最低版本要求,例如:

cmake_minimum_required(VERSION 3.10)
(3)set(<变量> <值>)

设置变量值,例如设置编译选项,例如:

set(MY_VARIABLE "Hello, World!") # 字符串
set(IS_DEBUG TRUE) # boolset(MY_LIST "apple" "banana" "cherry") # 列表

再次使用set命令可以修改变量:

set(MY_VARIABLE "Hello, World!")
message(${MY_VARIABLE})
set(MY_VARIABLE "Goodbye, World!")
message(${MY_VARIABLE})

${MY_VARIABLE}对变量取值,message用于打印,以上命令将依次打印"Hello, World!",“Goodbye, World!”

(4)add_compile_options(<选项…>)

添加编译器选项,适用于整个项目:

add_compile_options(-Wall -Werror)

这条命令将 -Wall-Werror 编译选项添加到所有目标中。

  • -Wall:启用所有常见的警告。
  • -Werror:将所有警告视为错误,编译过程中如果有警告则会停止编译。
(5)add_executable(<目标名> <源文件…>)

以下命令声明了一个名为 MyApp 的可执行文件目标,并指定了两个源文件 main.cpputils.cpp

set(ProjectName MyApp)
add_executable(${ProjectName} main.cpp utils.cpp)
(6)add_library(<库名> [STATIC | SHARED | MODULE] <源文件…>)

add_library 用于声明库目标的命令。库可以是静态库(.a.lib)、动态库(.so.dll),或者是模块库。

set(LibName MyLib)
add_library(${LibName} STATIC lib.cpp)
  • STATIC:生成静态库。
  • SHARED:生成动态库。
  • MODULE:生成模块库,通常用于插件系统。
(7)find_package(<包名> [版本] [REQUIRED] [COMPONENTS <组件列表>])

find_package 用于查找和加载外部库或工具的命令。

# 查找 Boost 库,并要求必须找到 filesystem 和 system 组件
find_package(Boost 1.65 REQUIRED COMPONENTS filesystem system)
# 链接 Boost 库
target_link_libraries(MyApp PRIVATE Boost::filesystem Boost::system)
(8)include_directories(<目录…>)

用于指定编译器在查找头文件时需要搜索的目录。通过使用 include_directories,可以添加一个或多个目录,使编译器能够在这些目录中查找头文件。

include_directories(${CMAKE_SOURCE_DIR}/include${CMAKE_SOURCE_DIR}/src/include)

以上命令包含CMake路径下的include路径和src/include路径下的所有头文件

(9)target_include_directories(<目标> PRIVATE|PUBLIC|INTERFACE <目录…>)

用于指定编译目标(如可执行文件或库)需要包含的头文件搜索路径的一个命令。target_include_directoriesinclude_directories的区别在于作用域,include_directories的作用域为全局,target_include_directories的作用域为编译目标。

add_library(my_library src/my_library.cpp) # 创建一个my_library的库文件
target_include_directories(my_library PRIVATE include/my_project) # 包含另一个项目的头文件
  • PRIVATE: 包含目录仅对当前目标可用,不会传递给依赖于这个目标的其他目标。
  • PUBLIC: 包含目录不仅对当前目标可用,也会传递给所有依赖于这个目标的目标。
  • INTERFACE: 包含目录只传递给依赖于这个目标的目标,但不对当前目标产生影响。这个选项通常用于库的目标,以告诉使用该库的其他目标需要哪些额外的包含路径。
(10)target_link_libraries(<目标> PRIVATE|PUBLIC|INTERFACE <库1> [<库2> …])

用于指定编译目标(例如可执行文件或库)需要链接的库,而无需手动管理链接顺序或路径。

target_link_libraries(my_executable PRIVATE my_library)
  • PRIVATE: 指定的库仅对当前目标有用,不会传递给依赖于这个目标的其他目标。
  • PUBLIC: 指定的库不仅对当前目标有用,还会传递给所有依赖于这个目标的目标。
  • INTERFACE: 指定的库只传递给依赖于这个目标的目标,但不对当前目标产生影响。这个选项主要用于库目标,以告诉使用该库的其他目标需要链接哪些额外的库。
(11)add_subdirectory(<子目录>)

包含子目录中的 CMakeLists.txt,以构建该子目录的内容:

set(SUB_SRC sub/src)
add_subdirectory(${SUB_SRC})
(12)include(<文件>)

用于包含另一个CMake文件,例如配置文件等

config.cmake

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")function(print_message message)message(STATUS "Custom message: ${message}")
endfunction()

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MyProject)include(config.cmake) # 引入配置文件
add_executable(my_executable src/main.cpp)
print_message("Hello, World!") # 使用config.cmake中的函数
(13)file(GLOB <variable> [RELATIVE <path>] <pattern> …)

根据模式匹配文件并将其路径存储到变量中的命令

  • <variable>: 存储匹配结果的变量名。
  • [RELATIVE <path>]: 可选参数,用于指定结果路径相对于哪个目录。如果不指定,则结果路径是绝对路径或相对于当前源目录的路径。
  • <pattern> ...: 一个或多个文件匹配模式。模式可以包含通配符,如 *?
file(GLOB SRC_FILES src/*.cpp src/*.h) # 收集 src 目录下的所有 .cpp 和 .h 文件
(14)AUX_SOURCE_DIRECTORY(<dir> <variable>)

用于获取指定目录中的所有源文件,并将这些文件的路径存储到一个变量中。与file(GLOB ...)的不同点在于AUX_SOURCE_DIRECTORY 会递归地扫描指定目录及其子目录中的所有源文件。

  • <dir>: 要扫描的目录路径。
  • <variable>: 存储找到的源文件路径的变量名。
AUX_SOURCE_DIRECTORY(src SRC_FILES) # 收集 src 目录下的所有源文件
message(STATUS "Source files: ${SRC_FILES}") # 输出收集到的文件列表
(16)install(TARGETS <目标> [DESTINATION <路径>])

用于指定如何安装目标(如可执行文件、静态库、动态库等)的命令

file(GLOB SRC_FILES src/*.cpp src/*.h) # 收集 src 目录下的所有 .cpp 和 .h 文件
install(DIRECTORY ${SRC_FILES} DESTINATION /usr/local/include) # 安装头文件到 /usr/local/include

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/468708.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HCIP园区网综合拓扑实验】配置步骤与详解(已施工完毕)

一、实验要求 实验拓扑图如上图所示 1、按照图示的VLAN及IP地址需求&#xff0c;完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan&#xff08;本实验未使用&#xff09; 4、上层…

【基于PSINS工具箱】以速度为观测量的SINS/GNSS组合导航,UKF滤波

基于【PSINS工具箱】&#xff0c;提供一个MATLAB例程&#xff0c;仅以速度为观测量的SINS/GNSS组合导航&#xff08;滤波方式为UKF&#xff09; 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码教程&#xff1a;使用UKF进行速度观测1. 引言与基本设置2. 初始设置3. U…

java访问华为网管软件iMaster NCE的北向接口时传递参数问题

上一篇文章介绍了利用《java访问华为网管软件iMaster NCE的北向接口》的一般性步骤&#xff0c;这里详细介绍其中一个读取性能数据的示例。原因是读取华为网管软件北向接口&#xff0c;完全找不到可供参考的例子。如果不需要传递什么参数&#xff0c;就能获取到结果&#xff0c…

基于SpringBoot的“在线考试系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“在线考试系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统登录界面图 用户注册界面图 管…

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

科大讯飞面经,蛮简单的

先来看面经&#xff1a; 下面我来简单聊聊这些问题。 自我介绍 关于如何自我介绍&#xff0c;这个如果还不会或者还没有准备&#xff0c;请先准备好你要如何向面试官介绍自己。 面试本来就是一个自我推销的方式之一&#xff0c;如果自我介绍都不会说&#xff0c;你如何卖个好价…

首次超越扩散模型和非自回归Transformer模型!字节开源RAR:自回归生成最新SOTA!

文章链接&#xff1a;https://arxiv.org/pdf/2411.00776 项目链接&#xff1a;https://yucornetto.github.io/projects/rar.html 代码&模型链接&#xff1a;https://github.com/bytedance/1d-tokenizer 亮点直击 RAR&#xff08;随机排列自回归训练策略&#xff09;&#x…

通义千问API调用测试 (colab-python,vue)

文章目录 代码&#xff08;来自官网&#xff09;colab中用python测试Qwen2.5在官网上查看并确定过期时间这里看到我的免费额度到25年5月在同一个页面&#xff0c;点击API示例 前端调用直接在前端调用的优缺点以vue为例&#xff08;代码是基于官网node.js的代码转换而来&#xf…

立体工业相机提升工业自动化中的立体深度感知

深度感知对仓库机器人应用至关重要&#xff0c;尤其是在自主导航、物品拾取与放置、库存管理等方面。 通过将深度感知与各种类型的3D数据&#xff08;如体积数据、点云、纹理等&#xff09;相结合&#xff0c;仓库机器人可以在错综复杂环境中实现自主导航&#xff0c;物品检测…

LSTM+LightGBM+Catboost的stacking融合模型

基本介绍 针对目前大部分数据同时具有特征连续和特征不连续的特点&#xff0c;将神经网络模型如LSTM和回归树模型如XGboost,基于stacking集成学习原理进行融合 附有模型评价指标R2、RMSE、MAE、MSE&#xff0c;代码包含注释&#xff0c;可以直接运行。 融合过程 在机器学习中…

人工智能 | 文生视频大模型

简介 文生视频指的是将文本描述转化为视频内容的技术&#xff0c;2024年2月15日 OpenAI 正式对外发布 Sora 人工智能模型&#xff0c;在人工智能领域掀起了一场风波&#xff0c;这是计算机视觉领域的一个突破。 Sora 这一名称起源于日文中“空”的含义&#xff0c;暗示了其具…

测试实项中的偶必现难测bug--一键登录失败

问题描述:安卓和ios有出现部分一键登录失败的场景,由于场景比较极端,衍生了很多不好评估的情况。 产生原因分析: 目前有解决过多次这种行为的问题,每次的产生原因都有所不同,这边根据我个人测试和收集复现的情况列举一些我碰到的: 1、由于我们调用的是友盟的一键登录的…

Pr:视频过渡快速参考(合集 · 2025版)

Adobe Premiere Pro 自带七组约四十多个视频过渡 Video Transitions效果&#xff0c;包含不同风格和用途&#xff0c;可在两个剪辑之间创造平滑、自然的转场&#xff0c;用来丰富时间、地点或情绪的变化。恰当地应用过渡可让观众更好地理解故事或人物。 提示&#xff1a; 点击下…

Jest项目实战(7):部署文档网站到 GitHub Pages

关于部署网站&#xff0c;理论上来讲&#xff0c;只要你有一个服务器&#xff0c;你要采用什么样的方式来部署都是可以的。但是前提是你需要有一个服务器&#xff08;物理机、云服务器&#xff09;。 这一小节我们部署文档网站选择使用 github 来进行部署&#xff0c;因为 Git…

第十九周:机器学习

目录 摘要 Abstract 一、吴恩达机器学习Exp1——线性回归 1、单变量线性回归 1.1数据集的读取及可视化 1.2分割训练集和验证集 1.3扩展维度 1.4线性回归模型 1.5训练过程可视化 2、多变量线性回归 2.1加载数据集并可视化 2.2划分训练集和验证集 2.3线性回归模型 …

Mac保护电池健康,延长电池使用寿命的好方法

使用Mac的过程中&#xff0c;如何延长电池的使用寿命是大家非常关心的问题&#xff0c;而养成一个良好的充电习惯能够有效的延长电池的使用寿命 避免过度充电和过度放电能够有效的保护电池&#xff0c;因此长时间的充电与长时间放点都不可取&#xff0c;但是在日常的使用过程中…

Python 爬虫数据清洗与存储:基础教程

Python 爬虫数据清洗与存储&#xff1a;基础教程 在爬虫数据获取完成后&#xff0c;数据往往是“原始”的&#xff0c;不适合直接使用。清洗和存储是将爬取到的原始数据转化为有用信息的关键步骤。本文将系统地介绍 Python 中进行数据清洗与存储的基本方法&#xff0c;帮助新手…

【博主推荐】VUE开发常用技术点收集

文章目录 1.系统主题的全局颜色变量申明和使用2.样式里面导入样式3.页面返回顶部功能4.页面实时更新时间功能5.页面条件判断的几种方式6.页面v-for使用7.页面路由跳转的几种方式8.vue3 js引用的几种方式9.Vue中引用和使用一个组件10.页面传参的几种方式VUE系列前端模板源码其他…

day08(单片机)时钟系统+定时器+PWM

目录 时钟系统定时器PWM 时钟系统 时钟基本概念 时钟源 晶体振荡器&#xff08;Crystal Oscillator&#xff09; RC振荡器&#xff08;Resistor-Capacitor Oscillator&#xff09; ​​​​​​​STM32U5时钟源 HSI(High Speed Internal) HSE(High Speed External) LSI(Low Spe…

linux盘扩容缩容

这里写目录标题 文件格式介绍问题&#xff1a;当根盘满了过后怎么办&#xff1f;解决方式&#xff1a; Xfs文件格式缩容扩容1. 备份2. 卸载home3. 缩容home&#xff08;home盘为xfs文件格式&#xff09;4. 扩容 /5. 恢复home备份 Ext4文件格式缩容扩容1. 备份&#xff08;可选&…