如何删除用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
的接口。另外,这可能会删除构建依赖项。
答案 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
。可以根据目标进行设置。