我对不同的机器架构(32位,64位等)了解甚少。因此,在不同的机器上使用C ++库时,经常会遇到麻烦,被烦人的“体系结构未定义符号...”困扰。
如果有人可以向我解释为什么当我在同一台计算机(装有Mountain Lion OS的2岁Mac)上使用以下命令时为什么会得到如此令人困惑的答案,我将非常高兴。该man uname
指示
-m打印机器硬件名称。
-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随附的所有硬件都是64位的,操作系统也是如此-但是,可以强制以仅32位的模式运行它。除非以32位模式运行,否则它能够执行64位和32位二进制文件。
在此平台上提供的大多数二进制文件(.dylib和可执行文件)都是“胖”二进制文件,这意味着它们同时包含32位Intel二进制文件和64位Intel二进制文件,有时还将其他架构(Power PC)的二进制文件合并到一个文件中。系统将自动加载二进制文件中最合适的部分。
由于底层编译器通常需要使用不同的标志运行才能为不同的体系结构生成二进制文件,甚至平台的#define也不同,从而使编译器在预处理后看到不同的源代码,因此二进制文件需要在每个平台分别编译一次,并且然后结合使用脂质工具。XCode可以代表您自动执行此过程。
尽管系统能够运行32位和64位不同的二进制文件,但它们的执行模型不同,因此无法在同一进程地址空间中组合它们。因此,如果您有一个仅作为64位的库,而另一个只有32位的库,则不能一起使用它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句