我有一个静态链接库(比如 libfoo)。

 add_library(foo STATIC foo.cpp)

有许多可执行文件链接(使用)这个库。
 add_executable(myexe1 myexe1.cpp)
 link_target_libraries(myexe1 foo)
 add_executable(myexe2 myexe2.cpp)
 link_target_libraries(myexe2 foo)
 add_executable(myexe3 myexe3.cpp)
 link_target_libraries(myexe3 foo)
 #... and so on. (These definitions are actually scattered in the project)

现在我想对库使用 -Wl,--whole-archive 标志。
似乎一种解决方案是在可执行端添加标志。
 add_executable(myexe1 myexe1.cpp)
 link_target_libraries(myexe1 -Wl,--whole-archive foo -Wl,--no-whole-archive)

但是这样我每次定义链接到这个库的可执行文件时都必须写这个。

有没有办法将此标志添加到库定义端,以便在链接依赖库的可执行文件时始终使用该标志?

最佳答案

我遇到了同样的问题,但无法阻止 CMAKE 重新排序标志和我的库。我最终做了这样的事情:

add_library(foo_actual STATIC foo.cpp)
add_library(foo INTERFACE)
set_property(TARGET foo PROPERTY INTERFACE_LINK_LIBRARIES
  -Wl,--whole-archive,$<TARGET_FILE:foo_actual>,--no-whole-archive)

与您的答案存在一些差异:
  • 我的 CMake (3.7) 版本不允许 get_property,但 $<TARGET_FILE> 运行良好并确保依赖项得到传播。
  • 我使用逗号将 --whole-archive 、 library 和 --no-whole-archive 都放在一个参数中,因此 CMake 不会对它们重新排序。否则,我无法让 CMake 不疯狂地重新排序它们。
  • 10-08 08:23
    查看更多