我无法理解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)?
感谢您的帮助
答案 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位模式启动。