9

我对 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 可执行文件,即使我有 arch 说我有一台 32 位机器(为什么?Core2 是 64);即使(我猜)我正在运行 32 位内核;即使我有一个针对 i686-apple-darwin 平台的编译器。为什么?他们怎么能跑?我应该编译 64 还是 32 ?

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

谢谢您的帮助

4

4 回答 4

15

Snow Leopard 上的默认编译器是 gcc4.2,其默认架构是 x86_64。构建 Mac 软件的典型方法是在不同的通道中构建多个架构,然后使用 lipo 组合结果。(lipo 仅将单拱文件编译成多拱文件,或从多拱文件中剥离拱。正如您所发现的,它对单拱文件没有实用程序。)

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

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

重要的是当你链接时,你是否有合适的链接架构。您不能将 32 位版本链接到 64 位二进制文​​件,反之亦然。所以重要的是看看你的链接库的架构是什么,确保它们是一致的,然后构建相同架构的二进制文件,这样你就可以链接到你拥有的库。

于 2009-09-21T17:34:57.433 回答
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

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

和你的系统一样,我的 mac mini 说它是 i386,尽管它显然使用 64 位平台,这又是一个错误,因为它是用 64 位硬件分发的。

$arch
i386
于 2009-10-28T15:24:33.070 回答
1

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

添加-arch i386 -arch x86_64到 CFLAGS 可以让您一次编译多个拱门的 gmp、mpfr 和诸如此类的东西。以这种方式构建 libusb 对我有用。

于 2013-08-27T06:48:37.547 回答
0

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

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

哦,雪豹只适用于英特尔芯片。

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

于 2009-09-21T17:39:24.397 回答