将静态库合并为一个STATIC库时的Libtorch / Pytorch困境

时间:2019-05-27 09:24:58

标签: linker static-libraries pytorch static-linking libtorch

我大约有26个静态库,例如liba.a, libb.a, libc.a, ..., libz.a。这里有两个要点:

1)例如liba.alibb.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 errorundefined 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脚本方法来自上面链接的最高投票答案,并且不起作用。 请删除重复的标记,以便人们做出贡献。谢谢。

0 个答案:

没有答案