本文使用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_DIRECTORY
和OUTPUT_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: