CMake之add_executable

本文使用CMake版本为3.22.1。

add_executable的官方文档:
https://cmake.org/cmake/help/v3.22/command/add_executable.html?highlight=add_execuable

作用

基于特定的源文件,创建可执行文件,名为<name>或者<name>.exe。

语法

在这里插入图片描述
创建名为<name>的target,这个target在make的时候会编译为可执行文件。编译的源文件为[source1] [source2]…。根据平台的不同,编译后的可执行文件名可能为<name>.exe或者<name>。

输出路径

关于编译的产物,默认情况下,输出路径和源文件的结构相匹配(例如源文件中CMakeLists.txt在subdir1下,则默认的可执行文件也在编译路径的subdir1下。默认的文件名基于<name>取名。

根目录

例如目录结构为:
在这里插入图片描述

其中的CMakeLists.txt内容为:

cmake_minimum_required(VERSION 3.22.1)
project(test-add-executable)
add_executable(${PROJECT_NAME} src/main.cpp)

在build下运行cmake .. ; make,就会在build下生成可执行文件,名称为${PROJECT_NAME}因为执行的CMakeLists.txt在根目录下,因此可执行文件也默认生成在编译的根目录下(build下)
在这里插入图片描述

子目录

如果执行add_executable的CMake是在子目录下,那么默认生成的可执行文件也在相应的子目录内。
现在在src内也放入CMakeLists.txt,并且在其中add exe。
在这里插入图片描述
src的CMake:

cmake_minimum_required(VERSION 3.22.1)
project(src)
add_executable(test-add-executable main.cpp)

根目录的CMake:

cmake_minimum_required(VERSION 3.22.1)
project(test-add-executable)
add_subdirectory(src)

在build下cmake .. ; make后,结果为:
在这里插入图片描述
默认的可执行文件就在build/src下了。

property

RUNTIME_OUTPUT_DIRECTORY

可执行文件的路径和名称可以通过RUNTIME_OUTPUT_DIRECTORYOUTPUT_NAME两个property来控制。这两个属性默认为空。
在这里插入图片描述
message打印的结果为NOTFOUNT:
在这里插入图片描述
可以主动设置RUNTIME_OUTPUT_DIRECTORY属性控制输出路径:

set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "abc/")

会自动创建目标目录:
在这里插入图片描述

OUTPUT_NAME

也可以设置OUTPUT_NAME控制输出名称:

set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "abcde")

在这里插入图片描述

EXCLUDE_FROM_ALL

add_executable(${PROJECT_NAME} EXCLUDE_FROM_ALL src/main.cpp)

当在函数中加入EXCLUDE_FROM_ALL之后,这个target(${PROJECT_NAME})就不会在make的时候做任何操作(因为make只对all target生效)。
make没有任何日志产生:
在这里插入图片描述
但是这个target依然存在的,需要make <target>来主动执行:
在这里插入图片描述

ALIAS

语法为:
在这里插入图片描述
用<name>来代替<target>,可以用来做常规操作,但不能通过<name>改变<target>的property。
通过alias获取property:

cmake_minimum_required(VERSION 3.22.1)

project(test-add-executable)

add_executable(${PROJECT_NAME} EXCLUDE_FROM_ALL src/main.cpp)

set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "abc/")

add_executable(test::add-exe ALIAS ${PROJECT_NAME})
get_target_property(alias_runtime_output_dir test::add-exe RUNTIME_OUTPUT_DIRECTORY)
message("alias_runtime_output_dir:${alias_runtime_output_dir}")

在上面CMake文件中,用test::add-exe来alias原本的exe target,通过alias name来获取源target的property,输出结果:
在这里插入图片描述

但不能通过alias name修改源target的property,即alias name相当于只读target。在上面的基础上加上以下命令:

set_target_properties(test::add-exe PROPERTIES RUNTIME_OUTPUT_DIRECTORY "cba/")

会告警,不能对alias target做set property:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值