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

时间:2018-02-02 04:52:05

标签: linux binary portability

我正在用C ++代码构建{% for key,value in d.items() %} {% for k,v in sorted(value.iteritems(), key=lambda (k,v): (v,k)): <table> <tr> <td>{{ key }}</td> <td>{{ k[-1] }}</td> <td>{{ v[-1] }}</td> </tr> </table> 。它仅取决于标准库(.a / libc++)。从一般阅读来看,似乎二进制文件的可移植性取决于

  • 编译器版本(因为它可以影响ABI)。对于libstdc++,ABI链接到主要版本号。
  • gcc / libc++个版本(因为它们可以将libstdc++传递给.a,其表示可能会发生变化)。

即。使用vector<T>的人需要使用相同的(主要版本)编译器+相同的标准库。

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

编辑:请参阅If clang++ and g++ are ABI incompatible, what is used for shared libraries in binary?(虽然它不会回答这个问题。)

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

1 个答案:

答案 0 :(得分:1)

  

它仅取决于标准库

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

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

邪恶在于细节。

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

Linux被视为free software生态系统。移植东西的常用方法是重新编译它 - 或至少为目标Linux发行版重新编译。当您多次这样做时(对于不同的许多 Linux发行版),您将了解详细信息中的重要性您的特定软件(和发行版)。

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

对于共享库,请阅读Program Library HowToC++ dlopen miniHowToelf(5)ABI规范(有关某些不完整列表,请参阅here),Drepper&#39; s How To Write Shared Libraries可能很有用。

我的建议是为各种常见的Linux发行版准备二进制packages。例如,Debian&amp; amp; .deb Ubuntu(一些特定的版本)。

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

还要查看autoconf(或cmake)等内容。您可能至少需要一些外部提供的#define - d预处理器字符串(通常由-D传递到gccg++),这些字符串会因分布不同而不同(例如,在某些发行版上,您按popen - lp打印,其他人打印popen - lpr,其他人通过与某些CUPS服务器等交互打印。 )。细节很重要。

  

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

但即使这些从一个发行版到另一个发行版也有很大的不同。

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

注意:您可能需要预算的工作量超出您的预期。