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

C++ .a: what affects portability across distros?

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

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

据我所知,如果编译器和标准库匹配,.a 应该适用于多个发行版。这是正确的吗?或者是否有与系统调用等相关的 gubbins,这意味着 Ubuntu 的 .a 应该构建在 Ubuntu 上,.a 应该构建 CentOS在 CentOS 上,等等?

编辑:参见 (虽然它没有回答这个问题。)

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

It only depends on the standard library

它也可能隐含地依赖于其他东西(想想字体、[=10=下的配置文件、[=11=下的头文件]、可用的/proc//sys/system(3) or execvp(3) 的外部程序 运行,特定的文件系统或设备,特定的 ioctl-s,可用或需要的插件等。 .)

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

细节决定成败

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

Linux 被视为 free software 生态系统。移植某些东西的通常方法是在目标 Linux 发行版上重新编译它,或者至少为目标发行版重新编译它。当你多次这样做时(对于 differentmany Linux distros),你会明白 细节 您的特定软件 (和发行版)中很重要。

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

对于共享库,阅读 Program Library HowTo, C++ dlopen miniHowTo, elf(5), your ABI specification (see here for some incomplete list), Drepper's How To Write Shared Libraries 可能会有用。

我的建议是为 Debian 和 Ubuntu(它们的某些 特定 版本)准备二进制文件 packages for various common Linux distributions. For example, a .deb

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

另请查看 autoconf (or cmake 之类的内容。您可能至少需要一些外部提供的 #define-d 预处理器字符串(通常由 -D 传递给 gccg++),这些字符串会因一个发行版而异(例如,在某些发行版上,您通过 popen-ing lp 打印,在其他发行版中,通过 popen-ing lpr 打印,在其他发行版中,通过与某些 CUPS 服务器等交互。 .).细节很重要。

My only interaction with the system is to open files

但即使是这些,从一种分布到另一种分布也有很大差异。

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

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