在用cmake生成工程文件(such as Makefile)编译项目的时候,有时我们希望debug/release生成的二进制文件在文件名上有区别:
比如对于target project1,在debug模式编译的dll,希望在Debug模式下生成的文件名为project1_d.dll
,以与release模式下编译的project1.dll
区别开。该怎么实现呢?
(本文末尾有更新内容)
这就要用到CMAKE的一个target属性:OUTPUT_NAME
OUTPUT_NAME
预定义target的生成目标文件名,如果没有指定,则默认为target的名字。
对于Debug/Release等不同的配置,还有对应的属性OUTPUT_NAME_DEBUG
和OUTPUT_NAME_RELEASE
,默认也是target的名字。
可以通过set_target_properties
设置OUTPUT_NAME_<CONFIG>
的值。
所以我们只要修改OUTPUT_NAME_DEBUG
的值就可以达到上述的要求。
下面的cmake脚本以一个functin实现了对指定的target,在debug模式下自动对输出的文件名加_d
后缀:
# debug模式下对输出文件名加_d后缀
# targets 输入参数,一组target
function(set_target_output_name targets)
foreach(target ${targets})
# 获取 OUTPUT_NAME_DEBUG 的值
get_target_property(_output_name ${target} OUTPUT_NAME_DEBUG)
if(_output_name)
# 如果 OUTPUT_NAME_DEBUG已经定义则直接在后面加_d
set_target_properties(${target} PROPERTIES OUTPUT_NAME_DEBUG "${_output_name}_d" )
else()
# 否则直接修改OUTPUT_NAME_DEBUG
set_target_properties(${target} PROPERTIES OUTPUT_NAME_DEBUG "${target}_d" )
endif()
get_target_property(_output_name ${target} OUTPUT_NAME_DEBUG)
# 显示修改后的结果
message(STATUS "TARGET:${target} OUTPUT_NAME_DEBUG=${_output_name}")
# 清除临时变量
unset(_output_name)
endforeach()
endfunction()
实际调用的效果如下:
– TARGET:fse_cas_static OUTPUT_NAME_DEBUG=fse_cas_static_d
– TARGET:fse_cas OUTPUT_NAME_DEBUG=fse_cas_d
– TARGET:fse_cas_static_mt OUTPUT_NAME_DEBUG=fse_cas_static_mt_d
也可以利用cmake-generator-expressions让写法更简化:
set_target_properties(${target} PROPERTIES OUTPUT_NAME "${target}$<$<CONFIG:Debug>:_d>" )
实际应用的例子参见:
https://gitee.com/l0km/feature_se/blob/master/feature_se/CMakeLists.txt
DEBUG_POSTFIX
cmake的内容实在是太多了,了解也是一步步深入的,今天找到了DEBUG_POSTFIX
这个target property,才知道上面的过程都太low了。
cmake已经提供了DEBUG_POSTFIX
这个target属性,用于指定deuug版本的文件结尾符,这才是最正确的打开方式。
所以要指定Target的debug版结尾符
只需要调用set_target_properties
或set_property
:
set_target_properties (myTarget PROPERTIES DEBUG_POSTFIX _d)
set_property(TARGET myTarget PROPERTY DEBUG_POSTFIX _d)
也可以通过set(CMAKE_DEBUG_POSTFIX _d)
预定义所有target的DEBUG_POSTFIX
。
NOTE
实际测试证明:使用DEBUG_POSTFIX指定输出文件结尾对executable target(可执行文件)无效。
参考资料
https://cmake.org/cmake/help/v3.1/prop_tgt/CONFIG_POSTFIX.html
https://cmake.org/cmake/help/v3.1/prop_tgt/DEBUG_POSTFIX.html
https://cmake.org/cmake/help/v3.1/variable/CMAKE_DEBUG_POSTFIX.html