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

CMake⼯程指南-2

1.CMake ⼯程实践场景

上⼀章我们介绍了cmake的基础命令⾏,介绍了如何⽣成构建⽂件,编译链接,安装等。本章节
我们会带领⼤家从⼀⾏⼀⾏⼿写CMake⽂件的⽅式开始,逐步熟悉如何⽤CMake 来管理各个场景下的 ⼯程需求,⽐如编译⼆进制,静态库,动态库,打包发布程序等。过程中也会逐步的介绍⼀些核⼼的 语法和函数,并⽤⼀些简单的例⼦来演⽰和验证。

1.1 可执⾏⽂件(编译-链接-安装)

本例⼦我们会编译和链接⼀个最简单的输出 hello world的C++程序 可执⾏程序,并本地运⾏,然后 安装到系统⽬录下。过程中会介绍⼀些遇到的新的CMake函数。
1.1.1 单步操作
我们创建⼀个新的 install_hello ⼯程
#include <iostream>
int main() {
std::cout << "Hello World" << std::endl;
return 0;
}
新建⽂件-CMakeLists.txt
# 1 设置最低cmake 版本
cmake_minimum_required(VERSION 3.18)
#2 设置项⽬名称
project(InstallHello
VERSION 1.2.3
LANGUAGES C CXX
)
# 3 添加构建⽬标
add_executable(hello main.cpp)
# 4 安装到本地
include(GNUInstallDirs)
install(TARGETS hello)
# printf
message(STATUS "PROJECT_NAME: ${PROJECT_NAME}")
# print version
message(STATUS "PROJECT_VERSION:" ${PROJECT_VERSION})
message(STATUS "PROJECT_VERSION_MAJOR:" ${PROJECT_VERSION_MAJOR})
message(STATUS "PROJECT_VERSION_MINOR:" ${PROJECT_VERSION_MINOR})
message(STATUS "PROJECT_VERSION_PATCH:" ${PROJECT_VERSION_PATCH})
# 打印 默认安装路径
message(STATUS "CMAKE_INSTALL_PREFIX:" ${CMAKE_INSTALL_PREFIX})
运⾏CMake
mkdir build && cd build
cmake ../
编译链接
cmake --build .
运⾏
./hello
安装
cmake --install .
运⾏
在 Linux 系统中,“安装” 指的是将编译好的⼆进制,库⽂件(通常是.a .so⽂件)及其头⽂件复
制到系统标准路径或⾃定义路径,以便其他程序可以链接和使⽤该库。放在标准路径下的 动态库和⼆ 进制,在其他程序链接时,甚⾄可以不⽤单独指定 gcc的 -L 和 -I 参数,gcc就可以在默认路径下⾃动查 找,从⽽简化编译流程。普通的⼆进制安装到默认路径下,也不⽤的在独⽴指定PATH,shell 解释器也 可以找到⼆进制,并运⾏

2.1重点命令解释

下⾯我们会进⼀步介绍上⾯出现在CMakeLists.txt的新函数

2.1.1cmake_minimum_required

函数作⽤:
指定项⽬所需的最低 CMake 版本,应放在顶级 CMakeLists.txt 的第⼀⾏。
基本形式
cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])
参数解释:

2.1.2 project

函数作⽤:
指定项⽬名字,放在顶级CMakeLists⽂件的第⼆⾏,⼦⽬录中⼀般⽆需调⽤
基本形式
project(<PROJECT-NAME>)
完整形式
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
关键参数

PROJECT_NAME 变量的使⽤场景:
1 动态库的输出名称
2 cmake配置⽂件的名称
3 命名空间的名称
PROJECT_VERSION 变量的使⽤场景:
1 打印变量
2 ⽣成pkg-config或者.cmake对应的版本配置⽂件
3 动态库/静态库的的版本号

2.1.3 include

函数作⽤:
加载指定的脚本⽂件或者模块到当前CMakeLists执⾏上下⽂中并运⾏。
基本形式
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>] [NO_POLICY_SCOPE])
关键参数
<file|module> 要运⾏的的⽂件或模块名称。
从⽂件或模块加载并运⾏ CMake 代码。
1 ⽂件的搜索路径:
如果指定的是相对路径,则相对当前的正在执⾏的CMakeLists.txt 所在的⽬录。
如果是绝对路径,那直接从对应的磁盘⽂件读取⽂件并加载执⾏。
2 Module 搜索路径顺序:
⾸先在当前⽬录查找指定⽂件。
然后在 CMAKE_MODULE_PATH 变量指定的⽬录中查找。
3 执⾏逻辑:
在当前执⾏上下⽂执⾏被包含的camke代码。

2.1.4 install

函数作⽤:
安装(简单理解为cp) 将 ⼆进制,静态库,动态库,头⽂件,配置⽂件 部署到指定⽬录。
基本形式
install(TARGETS <targets>... [EXPORT <export-name>]
[RUNTIME DESTINATION <dir>]
[LIBRARY DESTINATION <dir>]
[ARCHIVE DESTINATION <dir>]
[INCLUDES DESTINATION <dir>]
[...])
install(FILES <files>... DESTINATION <dir>
[PERMISSIONS <permissions>...]
[CONFIGURATIONS <configs>...]
[COMPONENT <component>]
[...])
install(DIRECTORY <dirs>... DESTINATION <dir>
[FILE_PERMISSIONS <permissions>...]
[DIRECTORY_PERMISSIONS <permissions>...]
[...])
install(EXPORT <export-name> DESTINATION <dir>
[NAMESPACE <namespace>::]
[FILE <filename>]
[...])
关键参数

2.1.5 add_executable

函数作⽤:
指⽰ cmake 从源代码⽣成⼀个可执⾏⽂件。
基本形式
add_executable(<target_name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
关键参数

默认情况下,将在与调⽤命令的CMakeLists.txt的⽬录相对应的 build tree directory 中创建可执⾏⽂ 件。 也可以使⽤ RUNTIME_OUTPUT_DIRECTORY ⽬标属性的更改默认的输出位置。
至此,本节内容到此结束,感谢大家的观看!
http://www.xdnf.cn/news/1393273.html

相关文章:

  • Linux系统——EXT2 文件系统
  • 记录:HSD部署(未完成)
  • 基于 Vue + Interact.js 实现可拖拽缩放柜子设计器
  • CosyVoice win10启用记
  • 《Shell 大道:筑基篇(下)—— 流控筑根基,数据任驱驰》
  • 【K8s】整体认识K8s之与集群外部访问--service
  • 【Doris入门】Doris表模型完全指南:明细、聚合、主键模型的选择与优化技巧
  • layout版图设计学习笔记4_Virtuoso基础介绍
  • Altium Designer 22使用笔记(10)---PCB铺铜相关操作
  • 如何解决网关断网后时间不再统计的问题?无RTC子设备如何打通主网关的时间同步功能?
  • Unity EventTrigger 动态添加事件
  • 电商数据的获取方式:API、爬虫、第三方服务及更多
  • 如何使用 Graylog 连接 Easysearch
  • Nginx原理及九大常见故障解决方法
  • idea2025.1.5安装+pj
  • MemoryVLA:让机器人拥有“记忆“的视觉-语言-动作模型
  • 3021. Alice 和 Bob 玩鲜花游戏
  • JSTL!
  • 期权合约作废了怎么处理?
  • STM32之IIC详解
  • IP v 6
  • five86: 2靶场渗透
  • 论文阅读:ICLR 2024 GAIA: A Benchmark for General AI Assistants
  • 嵌入式Linux LED驱动开发
  • Frida-dexdump 使用指南:从内存中脱取安卓 Dex 文件
  • 动态规划--Day03--打家劫舍--198. 打家劫舍,213. 打家劫舍 II,2320. 统计放置房子的方式数
  • 机器人视觉检测
  • 151.翻转字符串里的单词(字符串算法)
  • 昇腾算力加持,深度思考模型Colossal-R1上线魔乐社区
  • 多智能体框架(下)