C++ .a:什么影响跨发行版的可移植性?
C++ .a: what affects portability across distros?
我正在使用 C++ 代码构建 .a
。它只依赖于标准库(libc++
/libstdc++
)。从一般阅读来看,二进制文件的可移植性似乎取决于
- 编译器版本(因为它会影响 ABI)。对于
gcc
,ABI 链接到主版本号。
libc++
/libstdc++
版本(因为它们可以将 vector<T>
传递到 .a 中,并且它的表示可能会改变)。
即使用 .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 发行版上重新编译它,或者至少为目标发行版重新编译它。当你多次这样做时(对于 different 和 many 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
传递给 gcc
或 g++
),这些字符串会因一个发行版而异(例如,在某些发行版上,您通过 popen
-ing lp
打印,在其他发行版中,通过 popen
-ing lpr
打印,在其他发行版中,通过与某些 CUPS 服务器等交互。 .).细节很重要。
My only interaction with the system is to open files
但即使是这些,从一种分布到另一种分布也有很大差异。
您很可能无法为多个发行版提供 单个 - 和同一个 - lib*.a
。
注意:您可能需要预算比您认为的更多的工作。
我正在使用 C++ 代码构建 .a
。它只依赖于标准库(libc++
/libstdc++
)。从一般阅读来看,二进制文件的可移植性似乎取决于
- 编译器版本(因为它会影响 ABI)。对于
gcc
,ABI 链接到主版本号。 libc++
/libstdc++
版本(因为它们可以将vector<T>
传递到 .a 中,并且它的表示可能会改变)。
即使用 .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 发行版上重新编译它,或者至少为目标发行版重新编译它。当你多次这样做时(对于 different 和 many 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
传递给 gcc
或 g++
),这些字符串会因一个发行版而异(例如,在某些发行版上,您通过 popen
-ing lp
打印,在其他发行版中,通过 popen
-ing lpr
打印,在其他发行版中,通过与某些 CUPS 服务器等交互。 .).细节很重要。
My only interaction with the system is to open files
但即使是这些,从一种分布到另一种分布也有很大差异。
您很可能无法为多个发行版提供 单个 - 和同一个 - lib*.a
。
注意:您可能需要预算比您认为的更多的工作。