IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> CMake之add_custom_target -> 正文阅读

[C++知识库]CMake之add_custom_target

本文介绍了CMake中的add_custom_target命令。使用的CMake版本是3.22.1。
CMake中一切都是基于target的,如add_library会产生一个library的target,add_executable会产生一个exe的target…
本文的add_custom_target会根据命令的参数生成一个target,这个target相对的可以更定制化一点。

官方文档:https://cmake.org/cmake/help/v3.22/command/add_custom_target.html?highlight=add_custom

target默认不在all target中

all target的意思是,在cmake之后,make会生成和执行all target内所有的target。
例如add_executable默认就会生成在all target中。但如果在add_exe命令中加入EXCLUDE_FROM_ALL,才会从all target中移除,即make不会默认生成。
在这里插入图片描述
add_custom_target的target则是默认不在all target中。
如下面案例,定义了一个print-pwd的target,这个target执行pwd命令。

add_custom_target(
    print-pwd
    COMMAND "pwd"
)

make之后,是没有任何反应的,这证明了此target不是all target内:
在这里插入图片描述
对于这种target,需要make <target-name>才会执行:
在这里插入图片描述
以上打印了这个target的COMMAND信息,以及target build完成了。

ALL

在声明target的时候,可以加上ALL,这个target就会加入all target中,默认进行执行了。

add_custom_target(
    print-pwd
    ALL
    COMMAND "pwd"
)

在这里插入图片描述

DEPENDS

target之间可以有依赖关系,A依赖B(A depends on B),意味着A的build,需要基于B 已经build完成。
要实现A依赖B,则要在定义A的时候,加上DEPENDS B。具体如下案例:

add_custom_target(
    print-pwd
    COMMAND "pwd"
)

add_custom_target(
    depend-print-pwd
    COMMAND "echo" "depend pwd"
    DEPENDS print-pwd
)

定义了两个target,后者依赖前者,并且后者会打印"depend pwd"。
这里要注意一点,COMMAND中的命令和参数是分开的,如第二个target的COMMAND "echo" "depend pwd",而不能COMMAND "echo 'depend pwd'"

同样的,在make之后是没有反应的。在make depend-print-pwd后:
在这里插入图片描述
能发现会先build print-pwd,再build depend-print-pwd。

这里也可以把命令内的DEPENDS改为:add_dependencies(depend-print-pwd print-pwd),作用是一样的。

BYPRODUCTS

声明这个target在执行时随之生成的文件。
BYPRODUCTS需要和COMMAND配合使用,如果漏了COMMAND则会报错:

add_custom_target(
    byproduct
    BYPRODUCTS "aaa.txt"
)

在这里插入图片描述
BYPRODUCTS不会校验文件是否生成了,即使没有生成文件,也不会报错:

add_custom_target(
    byproduct
    COMMAND "echo" "aaa"
    BYPRODUCTS "aaa.txt"
)

执行cmake .. ; make byproduct
在这里插入图片描述
make clean会清理掉BYPRODUCTS指定的文件:

add_custom_target(
    byproduct
    COMMAND "touch" "aaa.txt"
    COMMAND "touch" "bbb.txt"
    BYPRODUCTS "aaa.txt"
)

执行结果:
在这里插入图片描述
执行make clean
在这里插入图片描述
在这里插入图片描述

WORKING_DIRECTORY

用于修改这个target执行COMMAND时所在的路径,支持绝对路径相对路径
默认是在编译路径下所在的子目录。

add_custom_target(
    work-dir
    COMMAND "pwd"
)

这个CMakeLists.txt是在源文件的src下的:
在这里插入图片描述
因此执行后打印的pwd就是在build内相应的子目录下:
在这里插入图片描述
在这里插入图片描述
WORKING_DIRECTORY使用绝对路径:

add_custom_target(
    work-dir
    COMMAND "pwd"
    WORKING_DIRECTORY "/root/cmake_learning/src/test-add-custom-target/build/src2"
)

执行mkdir src2 ; cmake .. ; make work-dir
那么执行时的路径就在配置的绝对路径下:
在这里插入图片描述
同样的,使用相对路径:

add_custom_target(
    work-dir
    COMMAND "pwd"
    WORKING_DIRECTORY "../src2"
)

执行命令,也是一样的效果。

那么在修改的执行路径后,BYPRODUCTS还有没有效果呢?

add_custom_target(
    work-dir
    COMMAND "pwd"
    COMMAND "touch" "aaa.txt"
    WORKING_DIRECTORY "../src2"
    BYPRODUCTS "aaa.txt"
)

可以看到文件生成成功了:
在这里插入图片描述
但是用了make clean之后,文件却没有被删除。

这是因为WORKING_DIRECTORY的功能实际上是在执行每个COMMAND的命令前,先cd到指定路径,在执行相应命令。
这是在调试过程中偶然发现的:
在这里插入图片描述
因此估计是BYPRODUCTS定位不到生成的文件,导致make clean失败。
BYPRODUCTS设置为相对路径的文件:

add_custom_target(
    work-dir
    COMMAND "pwd"
    COMMAND "touch" "aaa.txt"
    WORKING_DIRECTORY "../src2"
    BYPRODUCTS "../src2/aaa.txt"
)

make clean后删除成功了。
设置为绝对路径也成功了。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-09 20:30:34  更:2022-02-09 20:33:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:00:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码