机器类型(C ++ librairies):i386 vs x86_64

时间:2014-07-29 09:47:01

标签: c++ linux macos 32bit-64bit

我对不同的机器架构(32位,64位,......)了解甚少。 正因为如此,我经常在不同的机器上使用C ++库时遇到困难,被困在“恼人的”未定义的架构符号......“。

如果有人能够向我解释为什么当我在同一台机器上使用以下命令(一台2年的Mac山狮操作系统)时,我会很高兴为什么会得到这样令人困惑的答案? 。 man uname表示

  

-m打印机器硬件名称。

     

-p打印机器处理器体系结构名称。

  • 初看,我会说-p更相关。所以我运行uname -p并得到:

i386 (这意味着32位如果我没错的话)。

  • 但是对于我在同一台机器上编译的库,运行lipo -info lib_test.a会返回:

输入文件lib_test.a不是胖文件

非胖文件:lib_test.a是架构:x86_64 (这意味着64位如果我没有错)

  • 然而,后者与uname -m
  • 的回归更为一致

x86_64

1 个答案:

答案 0 :(得分:2)

这是Mac OS X的奇怪之处。英特尔OS X的所有硬件都是64位,操作系统也是如此 - 但是,它可以在32位模式下强制运行。除非以32位模式运行,否则它能够执行64位和32位二进制文​​件。

在这个平台上发布的大多数二进制文件(.dylib和可执行文件)都是" fat"二进制文件,意味着它们包含32位英特尔二进制文件和64位英特尔二进制文件,有时其他体系结构的二进制文件(Power PC)也包含在一个文件中。系统将自动加载二进制文件中最合适的部分。

因为底层编译器通常需要使用不同的标志来运行以生成不同体系结构的二进制文件,甚至平台#defines也不同,使得编译器在预处理后看到不同的源代码,二进制文件需要每次编译一次平台分开然后结合使用lipo实用程序。 XCode可以代表您自动执行此过程。

虽然系统能够运行32位和64位的不同二进制文件,但它们的执行模型不同,并且它们不能在同一进程地址空间中组合。因此,如果您只有一个64位的库而另一个只有32位,则不能一起使用它们。