【问题标题】:Any way to add a static library to a dynamic library without rebuilding dynamic library?有什么方法可以在不重建动态库的情况下将静态库添加到动态库中?
【发布时间】:2021-02-23 20:41:05
【问题描述】:

假设我有一个静态库libmystatic.a 和一个动态库libmydynamic.so。 是否可以使用arpatchelf 等命令行工具将libmystatic.a 存档放入动态库中?

所以这相当于重建libmy_dynamic.so 并编辑CMakeLists.txt 以添加:

target_link_libraries(my_dynamic libmy_static.a)

但正如我所提到的,我不想重建库。无论如何可以从命令行执行此操作?

【问题讨论】:

  • 我对此表示怀疑。如果要进入动态库与静态库,则目标文件需要以不同方式编译。
  • 这看起来有点像the XY problem。为什么要链接libmydynamic.solibmystatic.a 而不重新编译libmydynamic.so
  • 基本上这个问题与我自动化的 CI 构建有关。我首先将具有 GPU 支持的 mxnet 构建为动态库,然后缓存该库(如果我的 mxnet 构建脚本已更改,则仅在下一次 CI 构建时重建)。然后,我将自己的 SDK 库构建为静态库(此库在每次 CI 构建时都会更改)。最后修改mxnet cmake文件链接我刚建的静态库,然后重建mxnet库。
  • 问题是当我将我的静态 sdk 库添加到 target_link_libraries 调用然后重建 mxnet 库时,重建需要 30 分钟,这对于 CI 构建来说非常长。在 mxnet 的先前版本 (1.6) 中,重建花费了不到一分钟(这样做很好),但在 1.7 版本中,它需要 30 分钟,因为它需要重建几个以前不需要的模块。
  • (可能你的代码是用C++写的?那就正常了。不过,一个共享对象可以使用另一个共享对象,而后者可以在不改变前者的情况下重建。)

标签: linux cmake linker elf


【解决方案1】:

有没有可能

否(在大多数系统上)。否(在任何 ELF 系统上)。

一个完全链接的图像(例如可执行文件或共享库)被认为是最终的——链接器会丢弃您重建它所需的大部分信息。

AIX 是一个值得注意的例外——在那里可以重建某些类型的共享库。

【讨论】:

  • 说到这,aix-relink.pl 确实需要为 AIX 7 更新 ;-)
猜你喜欢
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多