【问题标题】:Cmake add_compile_definitions but for all targets [closed]Cmake add_compile_definitions 但适用于所有目标[关闭]
【发布时间】:2021-06-07 19:10:51
【问题描述】:

有没有办法在 cmake 中为所有创建的目标创建定义。到目前为止,当我

add_compile_definitions(MYDEFINITION)

在我的根 CmakeLists.txt 中,它似乎只为在该文件中创建的目标创建那些定义。但我想为子目录中创建的所有目标创建定义。最好的方法是什么?

【问题讨论】:

  • it seems to soo,嗯......不,它似乎没有。请创建一个minimal reproducible example。请注意,add_compile_definitions 会影响 在其之后 定义的目标,add_compile_definitions 之前 add_subdirectory 也是如此。
  • 我认为这是问题所在。然而,在 add_subdirectory 之前这样做的问题是我错过了子目录中的一些条件,这些条件会改变这些定义。在 cmake 中有没有好的方法来处理这个问题?
  • 子目录中的条件会影响它上面的内容吗?一个好方法是不要编写意大利面条代码 - 每个目录只影响下面的内容。重构代码。一个好方法是永远不要使用add_compile_definitions,而只使用target_* 的东西。

标签: c++ c cmake


【解决方案1】:

我为所有目标设置属性的常用解决方案是简单地添加一个common 目标,它具有我想要添加到所有目标的接口属性。

add_library(common INTERFACE)

target_compile_definition(common INTERFACE MYDEFINITION)

巧妙的是,您还可以放置其他内容,例如警告设置:

target_compile_options(common INTERFACE
    $<$<CXX_COMPILER_ID:MSVC>:/Wall>
    $<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra>
)

在common target中设置好common的东西后,可以在需要的地方使用:

add_library(mylib ...)
add_executable(myexe ...)

target_link_libraries(mylib PRIVATE common)
target_link_libraries(myexe PRIVATE common)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2017-06-26
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多