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

标签 linux binary portability

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

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

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

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

编辑:参见If clang++ and g++ are ABI incompatible, what is used for shared libraries in binary? (尽管它没有回答这个问题。)

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

最佳答案

It only depends on the standard library

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

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

问题在于细节。

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

Linux 被认为是 free software生态系统。移植某些东西的通常方法是在目标 Linux 发行版上重新编译它,或者至少为目标 Linux 发行版重新编译它。当您多次执行此操作(针对不同许多 Linux 发行版)时,您就会了解哪些细节对于您的特定软件(和发行版)很重要。

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

对于共享库,请阅读 Program Library HowTo , C++ dlopen miniHowTo , elf(5) ,你的ABI规范(请参阅 here 以获取一些不完整的列表),Drepper 的 How To Write Shared Libraries可能有用。

我的建议是准备二进制文件 packages适用于各种常见的 Linux 发行版。例如,.deb适用于 Debian 和 Ubuntu(其中一些特定版本)。

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

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

My only interaction with the system is to open files

但即使是这些,从一个发行版到另一个发行版也有很大差异。

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

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

关于linux - C++.a : what affects portability across distros?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48575902/

相关文章:

eclipse - 带插件的可移植 Eclipse Juno

linux - 绑定(bind)主从复制

linux - 重定向 301 www.www.example.com

linux - 是否可以从 linux 控制台调用应用程序选择窗口(右键单击->打开方式->其他)?

objective-c - 读取 9 位、10 位或 11 位(精确) block 中的数据并在 Objective-C/C 中转换为整数

java - 是否有支持通过 websocket 传输二进制文件的 Java/JVM 服务器?

c++ - Windows 和 Linux 中的可移植代码 C++

c - 从命令行检索全局变量值

c - 从二进制读取并存放在双字符数组上

c - x64 兼容的 C 源代码