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

Iss*_* T. 5 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的

小智 2

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

该平台上提供的大多数二进制文件(.dylib 和可执行文件)都是“胖”二进制文件,这意味着它们同时包含 32 位 Intel 二进制文件和 64 位 Intel 二进制文件,有时还包含其他架构 (Power PC) 的二进制文件合并到一个文件中。系统将自动加载二进制文件中最合适的部分。

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

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