在 cmake 中将目标文件名作为编译定义传递

Posted

技术标签:

【中文标题】在 cmake 中将目标文件名作为编译定义传递【英文标题】:Pass target file name as compile definition in cmake 【发布时间】:2014-12-08 15:03:34 【问题描述】:

我有许多目标的 CMakeLists.txt,并且目标定义了特定于配置的后缀。另外我想知道程序中可执行文件的名称。

在 MSVC++ 下我通过定义来做到这一点

add_definitions("-DTARGET_FILE_NAME=\"$(TargetFileName)\"")

但这在其他生成器中不起作用。既然 CMake 有了生成器表达式,有没有一种方法可以与任何生成器一起使用?

我尝试了类似的东西

add_definitions(-DTARGET_FILE_NAME=$<TARGET_FILE_NAME:$<TARGET_PROPERTY:NAME>>)

不过

add_definitions(-DTARGET_FILE_NAME=$<TARGET_PROPERTY:NAME>)

只放置未转义的$&lt;TARGET_PROPERTY:NAME&gt; in the buildfile. I also tried with just$`,但也没有运气。

请注意,compile 构建命令在许多构建文件中不知道 linker 输出的名称,因此似乎没有任何特定于生成器的 hack其中一些也是。

【问题讨论】:

【参考方案1】:

compile_definitions 不支持生成器表达式。使用target_compile_definitions,这样做:

target_compile_definitions(somelib PRIVATE NAME=$<TARGET_FILE_NAME:somelib>)

http://www.cmake.org/cmake/help/v3.1/command/target_compile_definitions.html

【讨论】:

现在,如果我能以某种方式说所有目标都应该得到定义(带有各自的文件名)。有很多。

以上是关于在 cmake 中将目标文件名作为编译定义传递的主要内容,如果未能解决你的问题,请参考以下文章

cmake - 如何根据谁使用它来定义目标库的符号

在自定义目标运行后重建依赖目标

如何在 MSVC 2019 中的 CMake 管理的 C++ 项目中将命令行启动参数添加到发布目标?

如何阻止CMake将特定于平台的标志传递给编译器?

CMake 重新编译

CMake:隐藏子目标的-WShadow全局编译标志