c++ - 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 函数/变量的硬编码字符串的情况下做同样的事情?
解决方案
有没有办法在没有使用 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()
推荐阅读
- webpack - Webpack没有将文件发送到正确的目的地
- apm - APM 中的服务是什么?
- r - 在 Shiny 中使用 R Markdown 发送电子邮件时遇到问题
- java - 在此处找不到任何 HTTP 请求标头
- django - 为什么 django 不在 CustomUser 模型中验证电子邮件?
- python - 如何修复 GTK 滚动窗口在内容更改后不更新滚动条?
- java - 在没有 gradle、maven 或 IDE 的情况下使用 MongoDB 和 Java
- python - 将 NER 训练数据转换为 Spacy 训练数据格式
- snmp - phpipam SNMP 代理端配置
- linux - pm2 log-rotate with ansible