机器types(C ++程序库):i386与x86_64

我对于不同的机器架构(32位,64位,…)没有多less了解。 正因为如此,在不同的机器上使用C ++库时,我常常遇到困难的“未定义的架构符号…”。

如果有人能向我解释为什么当我在同一台机器上使用下面的命令(一个2年前的Mountain Lion操作系统的mac)时,我会得到如此令人困惑的答案。 该man uname表示

-m打印机器的硬件名称。

-p打印机器处理器架构名称。

  • 首先,我会说,-p更相关。 所以我运行uname -p ,我得到:

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

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

input文件lib_test.a不是一个胖文件

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

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

x86_64的

Solutions Collecting From Web of "机器types(C ++程序库):i386与x86_64"

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

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

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

虽然系统能够运行不同的二进制文件(32位和64位),但其执行模式不同,不能在同一进程地址空间中组合。 所以如果你只有一个库只有64位而其他的只有32位,你不能一起使用它们。