我大约有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 linker question: the --whole-archive option
现在,我需要将所有26个lib*.a
合并到一个静态库liball.a
中。还要感谢stackoverflow,下面的MRI脚本。mri通过命令liball.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
解决此问题的一种方法是使用选择性注册。有人可以分享更多详细信息吗?
此问题不是How to merge two "ar" static libraries into one?的重复项 MRI脚本方法来自上面链接的最高投票答案,并且不起作用。 请删除重复的标记,以便人们做出贡献。谢谢。