【问题标题】:Creating a static C library for Linux that is portable across different GCC version为 Linux 创建一个可跨不同 GCC 版本移植的静态 C 库
【发布时间】:2017-11-30 17:07:44
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: c gcc static-libraries portability abi


    【解决方案1】:

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

    但是,如果您的库依赖于其他位(甚至只是 glibc),那么在您构建库时,您会冻结头文件中的声明和定义,这些依赖项的未来发展可以很好地使您今天与用户可能在未来数月或数年内安装的内容不兼容。

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

    【讨论】:

    • 就我而言,不存在对标准库的依赖。它是纯粹的可移植代码。另外:您介意链接到一些支持 GCC .o / .a 文件的 ABI 稳定性的官方文档吗?此外,GCC 也可以使用 Clang 二进制文件,还是只能使用相反的方式?以及如何找出什么是“成熟目标”?
    • 另外,像短枚举这样的标志呢?即使使用共享对象,库如何在不要求其所有客户端使用完全相同的标志的情况下实现可移植性?
    • @Etan:short-enums 是一个破坏 ABI 的选项,你只是不要使用。如果有人使用它,那是他们弄坏东西的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多