删除通过link_libraries()添加的库

时间:2019-10-01 16:18:56

标签: cmake

如何删除用link_libraries()添加的库?

是的,我知道我应该使用target_link_libraries()。我不能,因为我必须将库链接到每个将来的目标。 See this。该库是CMake构建的。 这对于C ++ / CMake开发人员应该是不可见的。他不必担心这个库。 示例:

add_library(link-to-all a.cpp)
link_libraries(link-to-all)
add_executable(e1 e1.cpp) # with link-to-all
add_executable(e2 e2.cpp) # with link-to-all
unlink_libraries(link-to-all) #does not exist!
add_executable(e3 e3.cpp) # without link-to-all
# all further targets link without link-to-all!

在我的情况下,all-to-all是一个具有覆盖率检查功能实现的库。根据配置选项启用它,并且应将其隐式用于所有即将来临的目标。可能无法针对特定目标进行覆盖率分析,因此我希望能够将其禁用。

通过在CMAKE_<LANG>_COMPILE_OBJECT前面启用覆盖,并通过删除前缀来禁用覆盖。 Afaik不能针对特定目标完成此操作,只能针对即将到来的目标进行全局操作。因此unlink_libraries()是一个我可以对称调用的函数。

function(enable_coverage)
   prepend_compiler();
   link_libraries(cov);
   # alternative with loosing target information/dependency
   # prepend_system_libs(<path>/libcov.a)
endfunction()
function(disable_coverage)
   reset_compiler();
   unlink_libraries(cov);
   # reset_system_libs()
endfunction()

我可以使用CMAKE_<LANG>_STANDARD_LIBRARIES(并将其删除),但是我需要在其中使用库的LOCATION(生成器表达式:TARGET)。但是我也会丢失link-to-all的接口。另外,这可能会删除构建依赖项。

2 个答案:

答案 0 :(得分:2)

虽然我同意@Guillaume的观点,但我会将建议合并为一个答案,因为链接的答案不是很清楚。 @Tsyvarev确认in the CMake source时,link_libraries()调用设置了LINK_LIBRARIES目标属性; target_link_libraries()调用执行相同的操作。最初将可执行文件e3设置为与所有库链接时,您可以使用get_target_property()set_property()的组合从列表中删除一个(或多个)库。这是一个示例,演示如何:

# Library to be linked to all targets.
add_library(link-to-all a.cpp)
# Library to be linked to (almost) all targets.
add_library(link-to-almost-all b.cpp)

link_libraries(link-to-all link-to-almost-all)
# Gets our link-everywhere libraries. Oops!
add_executable(e3 test.cpp)

# Get the LINK_LIBRARIES property for this target.
get_target_property(E3_LINKED_LIBS e3 LINK_LIBRARIES)
message("Libraries linked to e3: ${E3_LINKED_LIBS}")

# Remove one item from the list, and overwrite the previous LINK_LIBRARIES property for e3.
list(REMOVE_ITEM E3_LINKED_LIBS link-to-almost-all)
set_property(TARGET e3 PROPERTY LINK_LIBRARIES ${E3_LINKED_LIBS})

# Verify only one library is now linked.
get_target_property(E3_LINKED_LIBS_NEW e3 LINK_LIBRARIES)
message("Libraries linked to e3: ${E3_LINKED_LIBS_NEW}")

此处打印的消息确认已将库从LINK_LIBRARIES的{​​{1}}目标属性中删除:

e3

答案 1 :(得分:0)

作为补充答案,我重复我对方水壶答案的评论(以供将来参考):

您应该使用目标属性<LANG>_COMPILER_LAUNCHER而不是CMAKE_<LANG>_COMPILE_OBJECT。可以根据目标进行设置。