gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:38:32 27 4
gpt4 key购买 nike

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

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

-m print the machine hardware name.

-p print the machine processor architecture name.

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

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

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

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

非胖文件:lib_test.a 是体系结构:x86_64(如果我没记错的话,这意味着 64 位)

  • 然而,后者与 uname -m 的返回更一致,这是

x86_64

最佳答案

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

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

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

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

关于c++ - 机器类型(C++ 库): i386 vs x86_64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25012436/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com