我有大约 26 个静态库,例如liba.a, libb.a, libc.a, ..., libz.a
. 这里有两个问题:
1) 例如liba.a
和之间的循环依赖libb.a
;
2) 一些lib*.a
具有未引用的静态全局注册代码,但不应被剥离。
感谢stackoverflow,我设法用 ld 选项解决了上述两个问题 -Wl,--whole-archive -la -lb -lc -ld -le ...(omitted)... -lz -Wl,--no-whole-archive -lpthread -lm -ldl -lrt -fopenmp
,并且可执行二进制文件有效!ld 链接器问题中也对此进行了解释: --whole-archive 选项
现在我需要将所有 26个组合lib*.a
成一个静态库liball.a
。还要感谢 stackoverflow,下面的 MRI script.mriliball.a
通过命令成功生成ar -M < script.mri
create liball.a
addlib liba.a
addlib libb.a
addlib libc.a
addlib libd.a
... //omitted
addlib libz.a
save
end
但是,与新组合的静态库链接时出现了问题liball.a
:
1)使用选项-Wl,--whole-archive -lall -Wl,--no-whole-archive -lpthread -lm -ldl -lrt -fopenmp
失败!它产生数千个multiple defined symbols error
或undefined symbols error
!
2)没有选项-Wl,--whole-archive
,链接命令-lall -lpthread -lm -ldl -lrt -fopenmp
成功生成可执行二进制文件。但是,二进制文件无法执行,抱怨一些设备注册代码错误。我知道这是由于链接时某些 CPU 初始化代码被删减所致。下面是详细的错误
p INTERNAL ASSERT FAILED at ../c10/core/impl/DeviceGuardImplInterface.h:132, please report a bug to PyTorch. DeviceGuardImpl for cpu is not available (getDeviceGuardImpl at ../c10/core/impl/DeviceGuardImplInterface.h:132)
这里也提到了这个问题https://github.com/pytorch/pytorch/issues/14367
解决它的一种方法是使用选择性注册。任何人都可以分享更多细节吗?
这个问题不是如何将两个“ar”静态库合并为一个? MRI 脚本方法来自上述链接的最高投票答案,它不起作用。请删除重复标记,以便人们可以贡献。谢谢。