本文使用CMake版本为3.22.1。
add_executable的官方文档:
https://cmake.org/cmake/help/v3.22/command/add_executable.html?highlight=add_execuable
基于特定的源文件,创建可执行文件,名为
创建名为
关于编译的产物,默认情况下,输出路径和源文件的结构相匹配(例如源文件中CMakeLists.txt在subdir1下,则默认的可执行文件也在编译路径的subdir1下。默认的文件名基于
例如目录结构为:
其中的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下了。
可执行文件的路径和名称可以通过RUNTIME_OUTPUT_DIRECTORY和OUTPUT_NAME两个property来控制。这两个属性默认为空。
message打印的结果为NOTFOUNT:
可以主动设置RUNTIME_OUTPUT_DIRECTORY属性控制输出路径:
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "abc/")
会自动创建目标目录:
也可以设置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
语法为:
用
通过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:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)