在库依赖项中为多个目标定义编译定义

时间:2019-11-09 12:15:45

标签: cmake dependencies

是否可以为链接的库目标设置编译定义,但为每个目标使用的库设置不同的定义集(编译定义对于与每个目标链接的lib是互斥的)?

Target A > lib with -DDEF_A only
Target B > lib with -DDEF_B only

target_compile_definitions()仅允许您在目标上设置定义,但是如果在库目标上设置,则将为两个目标都设置。

我想到的唯一方法是创建一个添加新库目标的函数,以便可以使用不同的编译定义来定义多个库目标。

1 个答案:

答案 0 :(得分:1)

假设lib是在同一CMake构建树中创建的另一个目标,这可能适用于您已经提出的简单情况。您可以使用get_target_property()来获取LINK_LIBRARIESTargetA的{​​{1}}属性列表。如果TargetB在第一级链接依赖项列表中,则可以将编译定义添加到lib

lib

请注意,这仅在# Get the list of first-level link dependencies for TargetA and TargetB. get_target_property(TARGETA_LIBS TargetA LINK_LIBRARIES) get_target_property(TARGETB_LIBS TargetB LINK_LIBRARIES) # Loop through the TargetA dependencies. foreach(LIB ${TARGETA_LIBS}) # Was the 'lib' library added as a dependency to TargetA? if (${LIB} STREQUAL lib) # Yes, so add the compile definitions to 'lib'. target_compile_definitions(${LIB} PRIVATE DEF_A) endif() endforeach() # Loop through the TargetB dependencies. foreach(LIB ${TARGETB_LIBS}) # Was the 'lib' library added as a dependency to TargetB? if (${LIB} STREQUAL lib) # Yes, so add the compile definitions to 'lib'. target_compile_definitions(${LIB} PRIVATE DEF_B) endif() endforeach() 是目标的第一级依赖项时有效,它不会递归搜索依赖项,如{{ 3}}。另外,如果lib是接口库,则必须获取this answer属性。


编辑:基于答案:如果编译定义libDEF_ADEF_B目标中是互斥的。最干净的方法可能是创建一个单独的lib目标,一个目标用于lib,另一个目标用于TargetA。看起来可能像这样:

TargetB