C++ .a:什么会影响跨发行版的可移植性?



我正在用C++代码构建一个.a。它仅取决于标准库(libc++/libstdc++)。 从一般阅读来看,二进制文件的可移植性似乎取决于

  • 编译器版本(因为它会影响 ABI)。对于gcc,ABI链接到主版本号。
  • libc++/libstdc++版本(因为它们可以将vector<T>传递到.a中,并且其表示形式可能会更改)。

即使用该.a的人需要使用相同(主要版本)编译器 + 相同的标准库。

据我所知,如果编译器和标准库匹配,则.a应该跨多个发行版工作。这是对的吗?或者有没有与系统调用等相关的gubbins,这意味着Ubuntu的.a应该建立在Ubuntu上,.aCentOS应该建立在CentOS上,等等?

编辑:请参阅如果 clang++ 和 g++ 不兼容 ABI,二进制中的共享库使用什么?(虽然它没有回答这个问题。

编辑 2:我没有明确访问任何操作系统功能(例如通过system调用)。我与系统的唯一交互是打开文件并从中读取。

它只取决于标准库

它也可能隐含地依赖于其他东西(想想字体等资源,/etc/下的配置文件,/usr/include/下的头文件,/proc/的可用性,/sys/,由system(3)或execvp(3)运行的外部程序,特定的文件系统或设备,特定的ioctl-s,可用或必需的插件等......

这些细节可能会使移植变得困难。例如,查看 nsswitch.conf(5)。

邪恶在于细节。

(换句话说,如果没有更多细节,你的问题就没有多大意义)

Linux被认为是一个自由软件生态系统。移植某些内容的常用方法是在目标 Linux 发行版上重新编译它,或者至少为目标 Linux 发行版重新编译它。当您多次执行此操作(针对不同的许多Linux 发行版)时,您将了解您的特定软件(和发行版)中哪些细节很重要。

大多数时候,在不同的发行版上重新编译和移植库非常容易。有时,这可能很难。

对于共享库,阅读程序库 HowTo、C++ dlopen miniHowTo、elf(5)、您的 ABI 规范(参见此处查看一些不完整的列表)、Drepper 的How To Write Shared Libraries可能会很有用。

我的建议是为各种常见的Linux发行版准备二进制包。例如,Debian 和 Ubuntu 的.deb(它们的某些特定版本)。

当然,Debian 的.deb可能无法在 Ubuntu 上运行(有时确实如此)。

还要研究像autoconf(或cmake)这样的东西。您可能至少希望有一些外部提供的#define-d 预处理器字符串(通常由-D传递给gccg++),这些字符串从一个发行版到下一个发行版会有所不同(例如,在某些发行版上,您通过popen-inglp打印,在其他发行版上,通过popen-inglpr打印,在其他发行版上通过与某些 CUPS 服务器交互等)。细节决定成败。

我与系统的唯一交互是打开文件

但即使这些也因发行版而异。

您可能无法为多个发行版提供单个和相同的lib*.a

注意:你可能需要预算比你认为的更多的工作。

相关内容

  • 没有找到相关文章