前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cmake:DEBUG_POSTFIX 根据debug/release类型指定target的输出文件名

cmake:DEBUG_POSTFIX 根据debug/release类型指定target的输出文件名

作者头像
10km
发布2019-05-25 22:27:08
2.7K0
发布2019-05-25 22:27:08
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433693

在用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_DEBUGOUTPUT_NAME_RELEASE,默认也是target的名字。

可以通过set_target_properties设置OUTPUT_NAME_<CONFIG>的值。

所以我们只要修改OUTPUT_NAME_DEBUG的值就可以达到上述的要求。

下面的cmake脚本以一个functin实现了对指定的target,在debug模式下自动对输出的文件名加_d后缀:

代码语言:javascript
复制
# 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让写法更简化:

代码语言:javascript
复制
  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_propertiesset_property

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年04月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DEBUG_POSTFIX
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档