是否可以在OSX 10.6上构建在其他OSX 10.6系统上运行的32位应用程序?

时间:2011-07-17 00:10:51

标签: c++ macos makefile osx-snow-leopard

在OSX 10.6上使用make构建C ++项目时,我确定预编译器定义__LP64__似乎总是由编译器自动设置(即,它是未在任何头文件中定义)(参见Where is __LP64__ defined for default builds of C++ applications on OSX 10.6?)。这导致了一个问题:甚至可能在OSX 10.6上构建一个32位应用程序,它在另一个OSX 10.6系统上作为目标(并运行)吗?

我听说OSX 10.6 总是 64位操作系统 - 它甚至不可能将OSX 10.6作为32位操作系统运行。如果是这种情况,那么在OSX 10.6上构建一个32位应用程序不可能是有意义的,它将在另一个OSX 10.6系统上运行。

我需要知道这一点,所以我可以知道我是否正在构建一个64位应用程序(我一直在尝试将我当前的项目构建为32位应用程序,因为相应的Windows版本也正在构建作为32位 - 但我可能需要启用所有64位标志并将此应用程序的OSX 10.6版本构建为完整的64位应用程序。)

2 个答案:

答案 0 :(得分:3)

Mac OS X 10.6在32位Intel Mac上运行良好。它放弃了对PowerPC的支持。未来版本的Mac OS X(咳嗽咳嗽NDA咳嗽)可能会也可能不会支持32位Intel Mac,需要64位系统。

然而,即使是64位Mac,也支持运行32位进程,GCC可以针对i386目标(或PPC / PPC64 / ARMv6 / ARMv7目标)进行交叉编译。您必须确保所需的体系结构但是在构建标志中指定,或者它将默认为本机架构(即x86_64。)

如果您使用xcodebuild命令行实用程序并将其传递给Xcode项目包的路径,它将在调用GCC时自动使用项目中的构建设置。除非您使用通用的* NIX源代码编译,否则很少需要在Mac OS X上直接使用GCC。

如果您告诉我们您在Mac OS X上使用make的原因,我们可以为您提供更具体的建议,但Mac OS X上首选的命令行编译方法仍为{{1 }}

答案 1 :(得分:3)

是的,完全可以这样做。一个有限的示范:

$ tar -xf Packages/range-1.14.tgz
$ cd range-1.14
$ ls
COPYING   Makefile  README    gpl-3.0.txt range.c   range.mk  stderr.c  stderr.h
$ rmk CC='gcc -m32'
    gcc -m32 -g     -c stderr.c
    gcc -m32 -g     -c range.c
    gcc -m32 -o range -g     stderr.o range.o  
$ file range
range: Mach-O executable i386
$ rmk -u CC='gcc -m64' 
    gcc -m64 -g     -c stderr.c
    gcc -m64 -g     -c range.c
    gcc -m64 -o range -g     stderr.o range.o  
$ file range
range: Mach-O 64-bit executable x86_64
$ 

rmk -u相当于(GNU)make -B。这个海湾合作委员会是我家建的4.6.0。您可以使用Apple提供的GCC版本执行更多操作 - 例如交叉编译和/或通用构建。