2011-07-17 1 views
1

При построении C++ проектов с использованием make на OSX 10.6, я определил, что определение препроцессора __LP64__, кажется, всегда автоматически установленного компилятором (т.е. оно не определено в любом файле заголовка) (см Where is __LP64__ defined for default builds of C++ applications on OSX 10.6?). Это приводит к вопросу: возможно ли даже для создания 32-разрядного приложения на OSX 10.6, которое предназначено (и работает) на другой системе OSX 10.6?Возможно ли построить 32-разрядные приложения на OSX 10.6, которые работают на других системах OSX 10.6?

Я слышал, что OSX 10.6 всегда 64-разрядная ОС - что даже не возможно запустить OSX 10.6 в качестве 32-разрядной операционной системы. Если это так, то имеет смысл, что невозможно для создания 32-разрядного приложения на OSX 10.6, которое будет работать в другой ОС OSX 10.6.

Мне нужно знать это, чтобы я мог знать, создаю ли я 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», но я предположил, что файл 'runConfigure' для стороннего проекта (который имеет свой собственный флаг для 32-битных сборников) позаботится об этом. –

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. Редко необходимо использовать GCC непосредственно в Mac OS X, если вы не компилируете из общих источников * NIX.

Если вы сообщите нам, почему вы используете make в Mac OS X, мы можем предоставить вам более конкретные рекомендации, но предпочтительный способ компиляции в командной строке на Mac OS X по-прежнему xcodebuild.

+0

Я использую 'make', чтобы упростить кросс-платформенные сборки для Linux и OSX. Это серверное приложение без GUI и только очень небольшое количество вызовов, специфичных для ОС (в основном встроенных в установленные библиотеки C++, такие как Boost). Поэтому наиболее удобно иметь одну процедуру, определенную для процесса сборки, которая может выполняться как на Linux, так и на OSX. В противном случае, если вы создаете Xcode, нам нужны два совершенно разных набора инструкций для сборки Linux и сборки OSX. Это кажется разумным? –

+0

Кроме того, и, что еще важнее, есть некоторые файлы исправлений, которые были написаны для некоторых сторонних библиотек (в частности, Xerces), которые изменяют файлы конфигурации, предназначенные для использования с 'runConfigure' и' make' (но не Xcode), и мне пришлось бы пройти вручную и внести те же изменения в настройки проекта Xcode, если бы меня заставили использовать Xcode. –

+0

Точнее, 10.6 потеряли поддержку * загрузки * на машинах PowerPC, но почти все «современные» приложения PPC (т. Е. Те, что работают на 10,5 или 10,4 за пределами классической среды) все еще работают нормально на 10,6, благодаря Rosetta. В большинстве случаев можно принудительно принудительно выполнить среду исполнения из командной строки с помощью 'arch (1)', то есть 'arch -i386/usr/bin/python2.6' или' arch -ppc/usr/bin/python2 .6'. Это изменится, по-видимому, на 10,7. –