为Linux创建可在不同GCC版本

时间:2017-11-30 17:07:44

标签: c gcc static-libraries portability abi

我想将静态C库(.a)作为二进制文件分发。

给定某种CPU架构和平台(例如armv6 / Raspi):

  • 是否可以创建一个适用于所有不同GCC版本的单个二进制文件,即不同GCC版本之间是否存在ABI?
  • 是否可以使用来自Clang的相同二进制文件?

如果没有,我需要创建哪些GCC版本来创建不同的二进制文件?是否可以使用非常旧的GCC来构建二进制文件并期望更新的GCC版本正确链接它?

如果需要多个二进制文件:是否有任何流行软件作为静态库(.a文件)分发,可以作为最佳实践的参考检查如何执行此操作?

共享对象(.so)是否比静态库(.a)更好用?是否有任何由Linux定义的ABI允许使用不同GCC版本编译的程序导入.so或.a库?

这个问题与C ++无关。有问题的库只使用C99,纯粹是可移植的,即使不依赖于标准库。

1 个答案:

答案 0 :(得分:1)

对于成熟目标,GCC版本不会影响ABI。您可以升级并继续使用旧的二进制文件。切换到Clang也是如此。

但是,如果你的库依赖于其他位(甚至只是glibc),那么在你构建库时,你会冻结头文件中的声明和定义,这些依赖的未来演变很可能会成为你的今天与用户未来几个月或几年安装的产品不兼容。

GNU工具链对动态链接共享对象的ABI管理提供了更好的支持:与glibc或libgcc正确链接的东西将继续工作很长时间。对于静态库,这个关键的链接步骤尚未发生,并且ABI依赖项未在生成的静态库中正确编码。