虽然有一点经验,但我仍然对是否有必要在具有不同Linux版本的机器共享的网络文件系统下安装应用程序和/或构建C ++程序或C ++库的问题感到困惑(例如CentOS版本4.7,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。),以便可以在那些不同的机器下使用可执行文件或库文件?这里的原则是什么?
例如,在网络文件系统上,我有一个可在我的C ++程序下使用CentOS版本4.7,x86_64 ad gcc / g ++ 3.4.6 20060404(Red Hat 3.4.6-10)的机器构建的可执行文件。我惊讶地发现可执行文件可以在另一台机器上使用Ubuntu 8.10,x86_64和gcc / g ++(Ubuntu 4.3.2-1ubuntu12)4.3.2。我在第一台机器上构建并由我的程序使用的所有共享库在第二台机器上运行可执行文件时都不会报错。如果运行在不同机器上构建的可执行文件能够提供可靠的结果,我很担心吗?
另一个例子,我记得在64位机器上构建的可执行文件不能在32位机器上运行。但另一种方式是,在64位机器上运行构建在32位机器上的可执行文件?如何在不同的位机器上构建和使用C ++库文件?
如果可能的话,你能指点我一些参考资料,比如一些与我的问题有关的网页,书籍......?
谢谢和问候!
答案 0 :(得分:0)
你真的需要在每个不同的配置上测试你的程序才能绝对确定。
您通常可以在64位计算机上运行32位程序,因此如果需要,您可能只能使用32位版本。
您需要对每个平台上使用的gcc版本保持谨慎。在使用gcc 3构建OS和glibc的机器上运行使用gcc 4构建的程序可能会导致问题。因此,请确保至少主要版本号匹配。
显然,如果你有不同的机器架构,例如Sparc与AMD64,你将需要不同的版本。英特尔和AMD之间甚至存在一些微妙的差异,所以不要过度使用编译器优化,如果你编程使用SSE指令(如果你不知道这是什么,那么你没有使用它),请确保所有机器都支持您使用的SSE设置。
这里的关键问题是机器架构,正确库的可用性以及“ABI”或应用程序二进制接口。 ABI指定操作系统应如何使用机器寄存器和内存在程序的不同部分之间传递信息,例如,如何将数据推送到堆栈以将参数传递给函数。众所周知,GCC使用的ABI会不时发生变化,这就是为什么需要使用兼容版本的原因。
我不知道涵盖所有这些内容的书籍或网页。从GCC和Binutils的文档开始。并且没有替代良好的测试。