CMake可执行文件无法与新的接口库链接,具体取决于另一个库

时间:2019-04-23 15:33:40

标签: cmake

我具有以下依赖性:

add_library(lib)
add_library(ilib INTERFACE)
add_dependencies(ilib lib)
target_link_libraries(ilib INTERFACE
      "-Wl,--whole-archive $<TARGET_FILE:lib> Wl,--no-whole-archive")
add_executable(exe ilib)

当我更改了lib的某些源代码时,将按预期方式编译并重新构建lib。但是,exe没有链接新的lib。如果我使用add_executable(exe lib),则exe将始终链接新的lib。 (之所以使用ilib是因为我需要在使用lib之前对其进行处理。)

1 个答案:

答案 0 :(得分:1)

您希望lib会在与ilib链接时传播。

但是命令add_dependencies并未添加传播属性。您需要

# Linking with `ilib` will transitively link with a `lib`
target_link_libraries(ilib INTERFACE lib)

当需要对链接器使用--whole-archive选项时,可以通过以下方式完成:

target_link_libraries(ilib INTERFACE "-Wl,--whole-archive" lib "Wl,--no-whole-archive")

当解析给定函数的参数时,CMake将发现参数lib目标名称,并将添加适当的文件级依赖关系。有了这种依赖关系,只要更改了库文件,可执行文件就会重新链接。