2011-07-17 97 views
1

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

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

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

回答

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。这个GCC是我自制的4.6.0。您可以使用Apple提供的GCC版本做更多工作,例如交叉编译和/或通用构建。

+0

谢谢。这是我失踪的-m32国旗。事实上,我应该知道这一点,或者看看'man make',但是我假设第三方项目(它有自己的32位构建标志)的'runConfigure'文件将负责处理它。 –

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时项目中的构建设置。很少有需要直接在Mac OS X上使用GCC,除非您正在从通用* NIX源代码编译。

如果您告诉我们您在Mac OS X上使用make的原因,我们可能会给出更具体的建议,但Mac OS X上首选的命令行编译方法仍为xcodebuild

+0

为了简化跨Linux和OSX的跨平台构建,我使用'make'。这是一个没有GUI的服务器应用程序,只有少量的OS特定的调用(大多数嵌入在已建立的C++库(如Boost)中)。因此,为构建过程定义一个可在Linux和OSX上执行的单一过程是最方便的。否则,如果用Xcode构建,我们需要为Linux构建和OSX构建提供两套完全不同的指令。这看起来合理吗? –

+0

此外,也许更重要的是,有一些补丁文件已经写入了一些第三方库(特别是Xerces),它们修改了配置文件,用于“runConfigure”和“make”(但不是Xcode),如果我被迫使用Xcode,我必须手工完成Xcode项目设置的相同更改。 –

+0

更确切地说,10。6在PowerPC机器上放弃了对*引导*的支持,但几乎所有“现代”的PPC应用程序(即那些在Classic环境之外的10.5或10.4下运行的应用程序)仍能在10.6上运行良好,这要归功于Rosetta。在大多数情况下,可以使用'arch(1)',即'arch -i386/usr/bin/python2.6'或'arch -ppc/usr/bin/python2,从命令行强制执行环境.6'。这将在10.7显然改变。 –

相关问题