【发布时间】:2021-02-23 20:41:05
【问题描述】:
假设我有一个静态库libmystatic.a 和一个动态库libmydynamic.so。
是否可以使用ar 或patchelf 等命令行工具将libmystatic.a 存档放入动态库中?
所以这相当于重建libmy_dynamic.so 并编辑CMakeLists.txt 以添加:
target_link_libraries(my_dynamic libmy_static.a)
但正如我所提到的,我不想重建库。无论如何可以从命令行执行此操作?
【问题讨论】:
-
我对此表示怀疑。如果要进入动态库与静态库,则目标文件需要以不同方式编译。
-
这看起来有点像the XY problem。为什么要链接
libmydynamic.so和libmystatic.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++写的?那就正常了。不过,一个共享对象可以使用另一个共享对象,而后者可以在不改变前者的情况下重建。)