0

我有大约 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 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

解决它的一种方法是使用选择性注册。任何人都可以分享更多细节吗?

这个问题不是如何将两个“ar”静态库合并为一个? MRI 脚本方法来自上述链接的最高投票答案,它不起作用。请删除重复标记,以便人们可以贡献。谢谢。

4

0 回答 0