我正在用C++代码构建一个.a
。它仅取决于标准库(libc++
/libstdc++
)。 从一般阅读来看,二进制文件的可移植性似乎取决于
- 编译器版本(因为它会影响 ABI)。对于
gcc
,ABI链接到主版本号。 libc++
/libstdc++
版本(因为它们可以将vector<T>
传递到.a中,并且其表示形式可能会更改)。
即使用该.a
的人需要使用相同(主要版本)编译器 + 相同的标准库。
据我所知,如果编译器和标准库匹配,则.a
应该跨多个发行版工作。这是对的吗?或者有没有与系统调用等相关的gubbins,这意味着Ubuntu的.a
应该建立在Ubuntu上,.a
CentOS应该建立在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
传递给gcc
或g++
),这些字符串从一个发行版到下一个发行版会有所不同(例如,在某些发行版上,您通过popen
-inglp
打印,在其他发行版上,通过popen
-inglpr
打印,在其他发行版上通过与某些 CUPS 服务器交互等)。细节决定成败。
我与系统的唯一交互是打开文件
但即使这些也因发行版而异。
您可能无法为多个发行版提供单个和相同的lib*.a
。
注意:你可能需要预算比你认为的更多的工作。