为不同机器在网络文件系统下构建程序并安装软件

问题描述 投票:0回答:1

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

例如,在网络文件系统上,我在 CentOS 版本 4.7、x86_64 ad 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++ 库文件怎么样?

如果可能的话,您能给我提供一些与我的问题相关的参考资料,例如一些网页、书籍……吗?

感谢和问候!

linux 64-bit 32-bit nfs
1个回答
0
投票

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

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

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

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

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

我不知道有哪本书或网页涵盖了所有这些内容。 从 GCC 和 Binutils 的文档开始。 良好的测试是无可替代的。

© www.soinside.com 2019 - 2024. All rights reserved.