【问题标题】:Is it possible to artificially induce object file extraction for a given static library?是否可以为给定的静态库人为地诱导目标文件提取?
【发布时间】:2016-12-22 02:16:23
【问题描述】:

我最近在阅读 this answer 并注意到用户必须以正确的顺序链接静态库似乎很不方便。

是否有一些标志或#pragma 我可以在编译我的库时传递给gcc,以便始终包含我的库的目标文件?

更具体地说,我希望用户可以在另一个依赖它的库之前链接我的静态库,并且不会以未解析的符号结束,就像明确指定的目标文件一样链接器行是。

特别是,我正在寻找库的用户不需要做任何特殊事情的解决方案,只需要传递-lMylibrary,就像他们链接任何其他库的方式一样。

【问题讨论】:

  • 你真的应该研究一下 pkg-config 之类的东西,而不是一起破解一些半解决方案。
  • @rubenvb 感谢您的建议。实际上,我的图书馆已经朝着不同的方向发展,但我仍然发现答案非常有用。

标签: c++ linux gcc linker static-linking


【解决方案1】:

是否有一些标志或#pragma 我可以传递给 gcc

没有。

我希望用户可以在另一个依赖它的库之前链接我的静态库,并且不会以未解析的符号结束,就像在链接器行上明确指定的目标文件一样。

将您的“库”作为单个目标文件发送。换句话说,而不是:

ar ru libMyLibrary.a ${OBJS}

使用:

ld -r -o libMyLibrary.a ${OBJS} 

特别是,我正在寻找库的用户不需要做任何特殊事情的解决方案,只需要传递-lMylibrary,就像他们链接任何其他库的方式一样。

您可以将目标文件命名为libMyLibrary.a。我相信链接器会使用通常的规则搜索它,但是当它找到它时,它会发现这是一个目标文件,并将其视为目标文件,尽管它被“命名错误”。这至少应该适用于 Linux 和其他 ELF 平台。我不确定它是否可以在 Windows 上运行。

【讨论】:

  • 我只需要它在 Linux 上工作。这是一个绝妙的答案!我自己永远不会发现它,我真的很好奇你是怎么知道这个的。
猜你喜欢
  • 2020-10-07
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多