机器类型(c++库):i386 vs x86_64

machine type (C++ librairies) : i386 vs x86_64

本文关键字:vs i386 x86 类型 c++ 机器      更新时间:2023-10-16

我对不同的机器架构(32位,64位,…)知之甚少。正因为如此,当我在不同的机器上使用c++库时,我经常遇到困难,被恼人的"未定义的体系结构符号"所困扰。

如果有人能向我解释为什么当我在同一台机器(一台使用了2年的mac和mountain Lion OS)上使用以下命令时,我会得到如此令人困惑的答案,我会非常高兴。.man uname表示

-m打印硬件名称。

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

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

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

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

输入文件lib_test。a不是fat文件

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

  • 后者与
  • uname -m的返回更一致。

x86_64

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

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

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

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