Mac OSX 10.6编译器:32位与64位的令人费解的体验

时间:2009-09-21 17:25:10

标签: macos gcc osx-snow-leopard 32bit-64bit

我无法理解OSX 10.6雪豹提供的gcc编译器,主要是因为我缺乏64位环境的经验。

$ cat >foo.c
main() {}
$ gcc foo.c -o foo
$ file foo
foo: Mach-O 64-bit executable x86_64
$ lipo -detailed_info foo
input file foo is not a fat file
Non-fat file: foo is architecture: x86_64

然而,我的架构被视为intel i386类型(我拥有最新的Intel Core2 duo MacBook之一)

$ arch
i386

,编译器的目标是i686-apple-darwin10

$ gcc --version 
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)

当然,如果我编译32位,我会获得32位可执行文件。

$ gcc -m32 foo.c -o foo
$ file foo
foo: Mach-O executable i386

但我没有全面了解。编译器的默认设置是生成x86_64可执行文件,即使我有拱形说我有32位机器(为什么?Core2是64);即使(我猜)我正在运行32位内核;即使我有一个针对i686-apple-darwin平台的编译器。为什么?他们怎么跑?我应该编译64还是32?

这个问题是由于我试图在mac上编译gcc 4.2.3,但我遇到了一堆gmp,mpfr和libiberty(在某些情况下)为x86_64编译的问题。我应该编译所有x86_64吗?如果是这样,目标是什么(我猜不是i686-apple-darwin10)?

感谢您的帮助

4 个答案:

答案 0 :(得分:15)

Snow Leopard上的默认编译器是gcc4.2,其默认架构是x86_64。构建Mac软件的典型方法是在单独的传递中构建多个体系结构,然后使用lipo来组合结果。 (lipo只将单个arch文件编译成多个arch文件,或者从多个arch文件中删除arch。如你所发现的那样,它对单个arch文件没有任何实用性。)

编译器的位数与任何事情无关。您可以使用64位编译器构建32位二进制文​​件,反之亦然。 (您认为编译器的“目标”实际上是它的可执行文件,这是不同的。)

内核的位数与任何事情无关。您可以在32位内核上启动时构建和运行64位二进制文​​件,反之亦然。

当你链接时,重要的是你是否有适当的链接架构。您不能将32位版本与64位二进制文​​件链接,反之亦然。因此,重要的是要了解链接库的体系结构,确保它们是连贯的,然后构建相同体系结构的二进制文件,以便链接到您拥有的库。

答案 1 :(得分:2)

i686-apple-darwin10.0.0包含一个x86_64文件夹,大多数版本的autotools都不理解这个文件夹。换句话说,我会说gcc编译器不幸是对Snow Leopard的一个笑话。为什么要将32位和64位库捆绑到i686-apple-darwin10.0.0中是不可能的。

$ ls /usr/lib/gcc
i686-apple-darwin10 powerpc-apple-darwin10

您需要更改所有autotools配置文件以处理查找* 86- darwin 目录,然后查找我想象的64位库。

与你的系统一样,我的mac mini表示它的i386虽然显然使用的是64位平台,但自从64位硬件分发以来又是另一个错误。

$arch
i386

答案 2 :(得分:1)

Apple工具链支持多种体系结构。如果要创建包含x86和x86_64代码的胖二进制文件,则必须将参数-arch i386 -arch x86_64传递给gcc。编译器将一次为两个平台编译代码两次。

-arch i386 -arch x86_64添加到CFLAGS可以允许您一次编译多个arch的gmp,mpfr和诸如此类的东西。建立libusb对我有用。

答案 3 :(得分:0)

这个答案是错误的,但请参阅下面的评论

真正的问题是......你是如何获得32位版本的OSX的?我不知道Snow Leopard 拥有 32位版本,因为所有Apple的Intel芯片都是Core 2或Xeon,它们支持x86_64架构。

哦,Snow Leopard仅适用于英特尔芯片。

编辑:显然Snow Leopard以32位模式启动。