首页 > 解决方案 > cmake:在特定目标之前和之后添加链接器/归档选项

问题描述

我有一个库,其中符号应该导入到应用程序中,尽管它们没有在那里明确使用。该库的目的是执行静态构造函数,从而使其在运行时可用于应用程序(注册其符号)。

我找到了相应的标志(gcc):-Wl,--no-as-needed共享库和--whole-archive静态。在 cmake 中,我可以设置一个变量LINK_WHAT_YOU_USE来控制--no-as-needed标志,STATIC_LIBRARY_OPTIONS但它们将应用于接下来列出的所有库。我需要的是仅将它们应用于一个特定的库,即-Wl,--no-as-needed -lmylib -Wl,--as-needed-Wl,--whole-archive -lmylib -Wl,--no-whole-archive.

如何在 cmake 的帮助下以跨平台的方式做到这一点?

UPD。我找到了一种方法来做到这一点,但它看起来不够“跨平台”:

target_link_libraries(
  myapp PRIVATE
  "-Wl,--no-as-needed -Wl,--whole-archive" mylib "-Wl,--as-needed -Wl,--no-whole-archive")

它可以在 linux(ld) 上运行,但我怀疑它会在 windows/mac 上运行。有没有办法在没有使用 cmake 函数/变量的硬编码字符串的情况下做同样的事情?

标签: c++ccmakelinkage

解决方案


有没有办法在没有使用 cmake 函数/变量的硬编码字符串的情况下做同样的事情?

到目前为止,没有。你必须-Wl,--whole-archive自己写。

我相信在 cmake 中有一些会很好set_target_properties(static_target PROPERTIES WHOLE_ARCHIVE true),但我也猜想实现可能会很困难。

如果你想跨平台,你会检测到它:

check_c_compiler_flag('-Wl,--whole-archive' has_whole_archive)
if (has_whole_archive)
    use_it(-Wl,--whole-archive)
endif()

推荐阅读