我正在构建一个 .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
传递给 gcc
或 g++
),这些字符串会因一个发行版而异(例如,在某些发行版上,您通过 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/