Компилятор Mac OSX 10.6:загадочный опыт с 32-битной и 64-битной версиями
-
12-09-2019 - |
Вопрос
У меня проблемы с пониманием компилятора gcc, предоставляемого OSX 10.6 Snow Leopard, главным образом из-за отсутствия у меня опыта работы с 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 (у меня один из последних MacBook с Intel Core2 duo).
$ 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?
Этот вопрос возник из-за моей попытки скомпилировать gcc 4.2.3 на Mac, но у меня возникла куча проблем с компиляцией gmp, mpfr и libiberty (в некоторых случаях) для x86_64.Должен ли я скомпилировать все x86_64?Если да, то какова цель (я думаю, не i686-apple-darwin10)?
Спасибо за помощь
Решение
Компилятором Snow Leopard по умолчанию является gcc4.2, а его архитектура по умолчанию — x86_64.Типичный способ создания программного обеспечения для Mac — создание нескольких архитектур за отдельные проходы, а затем использование Lipo для объединения результатов.(lipo только компилирует файлы с одной дугой в файл с несколькими дугами или удаляет дуги из файла с несколькими дугами.Как вы обнаружили, он не имеет никакой полезности для файлов с одной аркой.)
Разрядность компилятора тут ни при чем.Вы можете собирать 32-битные двоичные файлы с помощью 64-битного компилятора и наоборот.(То, что вы считаете «целью» компилятора, на самом деле является его исполняемым файлом, а это совсем другое.)
Разрядность ядра тут ни при чем.Вы можете собирать и запускать 64-битные двоичные файлы при загрузке с 32-битным ядром, и наоборот.
Когда вы связываетесь, важно то, есть ли у вас подходящая архитектура для связывания.Вы не можете связать 32-битные сборки с 64-битными двоичными файлами и наоборот.Поэтому важно посмотреть, какова архитектура ваших библиотек ссылок, убедиться, что они согласованы, а затем создать двоичный файл с той же архитектурой, чтобы вы могли ссылаться на имеющиеся у вас библиотеки.
Другие советы
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-Дарвин каталоги, а затем ищу 64-битные библиотеки, я думаю.
Как и в вашей системе, мой Mac Mini говорит, что это i386, хотя он, очевидно, использует 64-битную платформу, что опять же является еще одной ошибкой, поскольку он распространяется с 64-битным оборудованием.
$arch
i386
Цепочки инструментов Apple поддерживают несколько архитектур.Если вы хотите создать толстый двоичный файл, содержащий код x86 и x86_64, вам необходимо передать параметры -arch i386 -arch x86_64
в gcc.Компилятор скомпилирует ваш код дважды для обеих платформ за один раз.
Добавление -arch i386 -arch x86_64
to CFLAGS может позволить вам скомпилировать gmp, mpfr и еще много чего для нескольких арок за один раз.Создание libusb таким способом сработало для меня.
Этот ответ неверен, но см. комментарии ниже.
Настоящий вопрос...как вы получили 32-битную версию OSX?Я не знал, что снежный барс имел 32-битная версия, поскольку все чипы Intel от Apple — это Core 2 или Xeon, поддерживающие архитектуру x86_64.
Да, и Snow Leopard работает только на чипах Intel.
Редактировать:Судя по всему Snow Leopard запускается в 32-битном режиме.