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

CMake常用语法、函数

CMake常用函数

1.基础命令

命令功能备注
#单行注释——
#[ [ ] ]块注释——
${ }从变量或宏中取出其值例如:${PROJECT_SOURCE_DIR}
cmake_minimum_required(VERSION 3.0)指定使用的 cmake 的最低版本非必须,如果不加可能会有警告
project()定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言如果不需要这些都是可以忽略的,只需要指定出工程名字即可
add_executable(可执行程序名 源文件名称)使用后面的源文件生成可执行程序源文件名可以是一个也可以是多个,如有多个可用空格或;间隔
set(VAR [value]将[value]存入变量VAR中[value]可以是多个,空格或;间隔
set(CMAKE_CXX_STANDARD 11)设置C++的标准CMAKE_CXX_STANDARD是预定义的宏
aux_source_directory(< dir > < variable >)dir:要搜索的目录,variable:将从dir目录下搜索到的源文件列表存储到该变量中——
file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)GLOB: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中,GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中GLOB与GLOB_RECURSE 二选一
include_directories(headpath)添加含头文件路径headpath:头文件路径
add_library(库名称 STATIC/SHARED 源文件1 [源文件2] …)使用源文件生成库STATIC:静态库,SHARED:动态库

2.包含库文件

link_libraries(<static lib> [<static lib>...])

参数1:指定出要链接的第一个静态库的名字,可以是全名 libxxx.a,也可以是掐头(lib)去尾(.a)之后的名字 xxx;
参数2-N:要链接的其它静态库的名字(根据实际情况是否需要);
如果该静态库不是系统提供的(自己制作或者使用第三方提供的静态库)可能出现静态库找不到的情况,此时可以将静态库的路径也指定出来:

link_directories(<lib path>)

在cmake中链接动态库的命令如下:

target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <item>... [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

target:指定要加载的库的文件的名字:该文件可能是一个源文件、一个动态库/静态库文件、一个可执行文件
PRIVATE|PUBLIC|INTERFACE:动态库的访问权限,默认为PUBLIC
如果各个动态库之间没有依赖关系,无需做任何设置,三者没有没有区别,一般无需指定,使用默认的 PUBLIC 即可,动态库的链接具有传递性,如果动态库 A 链接了动态库B、C,动态库D链接了动态库A,此时动态库D相当于也链接了动态库B、C,并可以使用动态库B、C中定义的方法。

3.日志

message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...)

(无) :重要消息
STATUS :非重要消息
WARNING:CMake 警告, 会继续执行
AUTHOR_WARNING:CMake 警告 (dev), 会继续执行
SEND_ERROR:CMake 错误, 继续执行,但是会跳过生成的步骤
FATAL_ERROR:CMake 错误, 终止所有处理过程
例如:

# 输出一般日志信息
message(STATUS "source path: ${PROJECT_SOURCE_DIR}")
# 输出警告信息
message(WARNING "source path: ${PROJECT_SOURCE_DIR}")
# 输出错误信息
message(FATAL_ERROR "source path: ${PROJECT_SOURCE_DIR}")

4.变量操作

命令功能
set(变量名1 ${变量名1} ${变量名2} …)将从第二个参数开始往后所有的字符串进行拼接,结果覆盖写入到第一个参数中
list(APPEND < list> [< element> …])APPEND表示进行数据追加,后边的参数和set就一样了
list(REMOVE_ITEM < list> < value>)从list中移除后面的value
list(LENGTH < list> < outputvariable>)获取 list 的长度,< output variable>:新创建的变量,用于存储列表的长度
list(GET < list> < element index> < output variable>)读取列表中指定索引的的元素,可以指定多个索引
list (JOIN < list> < glue> < output variable>)将列表中的元素用连接符(glue)连接起来组成一个字符串
list(FIND < list> < value> < output variable>)查找列表是否存在指定的元素,若果未找到,返回-1
list(INSERT < list> < element_index> < element> [< element> …])在list中指定的位置插入若干元素
list (PREPEND < list> [< element> …])将元素插入到列表的0索引位置
list (POP_BACK < list> [< out-var>…])将列表中最后元素移除
list (POP_FRONT < list> [< out-var>…])将列表中首元素移除
list (REMOVE_ITEM < list> < value> [< value> …])将指定的元素从列表中移除
list (REMOVE_AT < list> < index> [< index> …])将指定索引的元素从列表中移除
list (REMOVE_DUPLICATES < list>)移除列表中的重复元素
list(REVERSE < list>)列表翻转

列表排序

list (SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])
/*
COMPARE:指定排序方法。有如下几种值可选:STRING:按照字母顺序进行排序,为默认的排序方法FILE_BASENAME:如果是一系列路径名,会使用basename进行排序NATURAL:使用自然数顺序排序
CASE:指明是否大小写敏感。有如下几种值可选:SENSITIVE: 按照大小写敏感的方式进行排序,为默认值INSENSITIVE:按照大小写不敏感方式进行排序
ORDER:指明排序的顺序。有如下几种值可选:ASCENDING:按照升序排列,为默认值DESCENDING:按照降序排列
*/

5.宏定义

在进行程序测试的时候,我们可以在代码中添加一些宏定义,通过这些宏来控制这些代码是否生效,如下所示:

#include <stdio.h>
#define NUMBER  3int main()
{int a = 10;
#ifdef DEBUGprintf("我是一个程序猿, 我不会爬树...\n");
#endiffor(int i=0; i<NUMBER; ++i){printf("hello, GCC!!!\n");}return 0;
}

在程序的第七行对DEBUG宏进行了判断,如果该宏被定义了,那么第八行就会进行日志输出,如果没有定义这个宏,第八行就相当于被注释掉了,因此最终无法看到日志输入出(上述代码中并没有定义这个宏)。
为了让测试更灵活,我们可以不在代码中定义这个宏,而是在测试的时候去把它定义出来,其中一种方式就是在gcc/g++命令中去指定,如下:

gcc test.c -DDEBUG -o app

在gcc/g++命令中通过参数 -D指定出要定义的宏的名字,这样就相当于在代码中定义了一个宏,其名字DEBUG
在CMake中我们也可以做类似的事情,对应的命令叫做add_definitions():

add_definitions(-D宏名称)//针对上面的例子在对应CMakeLists.txt文件中写这句就等于gcc test.c -DDEBUG -o app
//add_definitions(-DDEBUG)

下面的列表中为大家整理了一些CMake中常用的宏:

功能
PROJECT_SOURCE_DIR使用cmake命令后紧跟的目录,一般是工程的根目录
PROJECT_BINARY_DIR执行cmake命令的目录
CMAKE_CURRENT_SOURCE_DIR当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIRtarget 编译目录
EXECUTABLE_OUTPUT_PATH重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH重新定义目标链接库文件的存放位置
PROJECT_NAME返回通过PROJECT指令定义的项目名称
CMAKE_BINARY_DIR项目实际构建路径,假设在build目录进行的构建,那么得到的就是这个目录的路径

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • NacosRce到docker逃逸实战
  • HCIP第九章(MPLS理论)
  • Spring Cloud全解析:配置中心之springCloudConfig使用消息总线进行动态刷新
  • 测试金山文档 | WPS云文档
  • 使用Java调用Apache commons-text求解字符串相似性实战
  • Spring中的BeanFactoryAware
  • OCR调研
  • 【实现100个unity特效之20】用unity实现物品悬浮和发光像素粒子特效
  • EXCEL数据清洗步骤
  • 3.js - 顶点着色器、片元着色器的联系
  • JDK源码——ThreadLocal
  • 《光与夜之恋》3D建模含量超标,纯炫技还是释放新信号?
  • 你和NumPy之间,只差这40张图
  • Unity教程(十)Tile Palette搭建平台关卡
  • Spring自动注册-自定义标签解析
  • CSS 提示工具(Tooltip)
  • Facebook AccountKit 接入的坑点
  • GraphQL学习过程应该是这样的
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JS基础之数据类型、对象、原型、原型链、继承
  • Laravel 实践之路: 数据库迁移与数据填充
  • LeetCode29.两数相除 JavaScript
  • linux学习笔记
  • php中curl和soap方式请求服务超时问题
  • unity如何实现一个固定宽度的orthagraphic相机
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 微信小程序实战练习(仿五洲到家微信版)
  • 系统认识JavaScript正则表达式
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • #nginx配置案例
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Java入门)学生管理系统
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (Ruby)Ubuntu12.04安装Rails环境
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (分类)KNN算法- 参数调优
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (七)Activiti-modeler中文支持
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (太强大了) - Linux 性能监控、测试、优化工具
  • .Net 6.0 处理跨域的方式
  • .Net 8.0 新的变化
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net FrameWork总结
  • .net 连接达梦数据库开发环境部署
  • .NET框架
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .sdf和.msp文件读取