【问题标题】:Access CMake's target/library name at compile time globally在编译时全局访问 CMake 的目标/库名称
【发布时间】:2022-12-09 04:22:37
【问题描述】:

我们实现了一个记录器,它会自动打印出日志条目的项目名称以及其他信息。

我们最近将我们的构建系统从使用本机 Microsoft visual c++ 更改为生成的 cmake。

使用本机 Microsoft c++ 构建文件,我们只是在全局“.props”中定义一个宏“PROJECT_NAME”:
<PreprocessorDefinitions>%(PreprocessorDefinitions);PROJECT_NAME=R"($(ProjectName))"</PreprocessorDefinitions>

但是,现在我们使用 CMake,我很难找到一种在编译时访问项目名称的好方法。我可以在编译时使用 configure_file 或 target_compile_definitions 访问 CMake 变量,但我不知道有任何变量持有带有目标名称的字符串。有这样的变量还是可以定义?
另外,是否可以只在一个地方定义?我不想在每个 CMakeList.txt 中复制粘贴一行这样的内容:
target_compile_definitions(MYTARGET PRIVATE PROJECT_NAME="$mytarget_name")

【问题讨论】:

  • CMake 不会创建包含项目名称的自动宏。如果要为项目中的所有目标定义一个可用的宏,请使用 add_compile_definitions 命令。

标签: c++ visual-c++ cmake


【解决方案1】:

如果您有多个选项可应用于所有目标,您可以链接一个 INTERFACE 库,它允许您通过单个 target_link_libraries 使用继承此 cmake 目标的多个属性。

要使用链接目标的名称,可以使用不需要指定目标的生成器表达式:

add_library(OptionsForAll INTERFACE)

# note: using the target name not the cmake project name here
target_compile_definitions(OptionsForAll INTERFACE PROJECT_NAME="$<TARGET_PROPERTY:NAME>")

target_link_libraries(MYTARGET PRIVATE OptionsForAll)

@Tsyvarevs comment 中提到的另一个选项是使用 add_compile_definitions 将定义应用于当前目录和子目录中定义的所有目标,但这使得它更难从某些目标中删除......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多