0

尽管有一点经验,但我仍然对是否需要在具有不同 Linux 版本(例如 CentOS 4.7 版)的机器共享的网络文件系统下安装应用程序和/或构建 C++ 程序或 C++ 库的问题感到困惑, Ubuntu 8.10), 可能不同的位 (例如 32 位, 64 位) 和不同版本的编译器 (例如 gcc/g++ 3.4.6 20060404 (Red Hat 3.4.6-10), gcc/g++ (Ubuntu 4.3.2 -1ubuntu12) 4.3.2.),这样可执行文件或库文件可以在那些不同的机器下使用吗?这里的原则是什么?

例如,在网络文件系统上,我在 CentOS 版本 4.7、x86_64 和 gcc/g++ 3.4.6 20060404 (Red Hat 3.4.6-10) 的机器下从我的 C++ 程序构建了一个可执行文件。我惊讶地发现可执行文件可以在另一台装有 Ubuntu 8.10、x86_64 和 gcc/g++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2 的机器下使用。此外,当可执行文件在第二台机器上运行时,我在第一台机器上构建并由我的程序使用的所有共享库都不会报错。我很担心在不同机器上运行的可执行文件是否会产生可靠的结果?

另一个例子,我记得在 64 位机器上构建的可执行文件不能在 32 位机器上运行。但是反过来呢,在 64 位机器上运行一个在 32 位机器上构建的可执行文件呢?跨不同位机构建和使用的 C++ 库文件怎么样?

如果可能的话,你能否给我一些参考资料,比如一些与我的问题相关的网页、书籍等?

谢谢并恭祝安康!

4

1 回答 1

0

您确实需要在每种不同的配置上测试您的程序以绝对确定。

您通常可以在 64 位机器上运行 32 位程序,因此如果您愿意,您可以只使用 32 位版本。

您需要注意每个平台上使用的 gcc 版本。在使用 gcc 3 构建操作系统和 glibc 的机器上运行使用 gcc 4 构建的程序可能会给您带来问题。因此,请确保至少主要版本号匹配。

显然,如果您有不同的机器架构,例如 Sparc 与 AMD64,您将需要不同的版本。Intel 和 AMD 之间甚至存在一些细微的差异,所以不要过度使用编译器优化,如果你的程序使用 SSE 指令(如果你不知道这是什么,那么你就没有使用它),请确保所有机器都支持您使用的 SSE 集。

这里的关键问题是机器架构、正确库的可用性以及“ABI”或应用程序二进制接口。ABI 指定操作系统应如何使用机器寄存器和内存在程序的不同部分之间传递信息,例如,如何将数据压入堆栈以将参数传递给函数。众所周知,GCC 使用的 ABI 会不时更改,这就是为什么需要使用兼容版本的原因。

我不知道涵盖所有这些内容的书籍或网页。从 GCC 和 Binutils 的文档开始。并且没有什么可以替代良好的测试。

于 2009-08-19T17:38:22.570 回答