是否可以为链接的库目标设置编译定义,但为每个目标使用的库设置不同的定义集(编译定义对于与每个目标链接的lib是互斥的)?
Target A > lib with -DDEF_A only
Target B > lib with -DDEF_B only
target_compile_definitions()
仅允许您在目标上设置定义,但是如果在库目标上设置,则将为两个目标都设置。
我想到的唯一方法是创建一个添加新库目标的函数,以便可以使用不同的编译定义来定义多个库目标。
答案 0 :(得分:1)
假设lib
是在同一CMake构建树中创建的另一个目标,这可能适用于您已经提出的简单情况。您可以使用get_target_property()
来获取LINK_LIBRARIES
和TargetA
的{{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属性。
编辑:基于答案:如果编译定义lib
和DEF_A
在DEF_B
目标中是互斥的。最干净的方法可能是创建一个单独的lib
目标,一个目标用于lib
,另一个目标用于TargetA
。看起来可能像这样:
TargetB