Статические библиотеки в кросс-скомпилированной программе - PullRequest
8 голосов
/ 17 сентября 2009

У меня есть приложение командной строки Unix (с большим неприятным make-файлом), которое я пытаюсь запустить на Mac. Я собираю его в системе 10.6 со всеми соответствующими библиотеками, конечно. Среда развертывания - это система 10.5 без дополнительных библиотек.

Я скомпилировал без -dynamic, и похоже, что он имеет статические библиотеки, правильно. Когда я запускаю его в системе 10.6, он работает. Однако, когда я запускаю его в системе 10.5, я получаю:

dyld: неизвестная требуемая команда загрузки 0x80000022

Я получил ту же ошибку при компиляции для системы 10.6 с использованием кода 10.5, так что это похоже на проблему несовпадения версий. Однако я использовал gcc-4.0 и

$ CFLAGS = -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min = 10,5

так что ДОЛЖНО быть настроено на 10,5 ... какие-нибудь идеи?

спасибо

Редактирование древнего вопроса:

У меня точно такая же проблема на другом компьютере. На этот раз я на 10.5.8, полностью обновляюсь, тот же исполняемый файл работает на 10.6 все еще.

Кому-нибудь повезло с этим в те месяцы, с тех пор как я это спросил?

Ответы [ 6 ]

3 голосов
/ 20 октября 2011

Причина ошибки dyld 0×80000022 может быть в том, что вы подключаетесь к OS X 10.6, а OS X 10.6 будет использовать команду загрузки (LC_DYLD_INFO_ONLY = 0×80000022), которую OS X 10.5 делает не понимаю.

Чтобы исправить это, убедитесь, что вы используете цель развертывания, установив переменную среды непосредственно перед командой ссылки:

export MACOSX_DEPLOYMENT_TARGET=10.5

(или setenv MACOSX_DEPLOYMENT_TARGET=10.5)

Вы всегда можете проверить, использует ли ваш исполняемый файл правильную команду загрузки, например:

otool -l executable 

В нем будут отображаться команды LC_DYLD_INFO_ONLY (без цели развертывания) или LC_DYLD_INFO (с целью развертывания).

2 голосов
/ 16 июня 2010

Я искал ту же проблему, что и для 10.6, но у меня должна быть версия, которая работает на 10.5. В дополнение к указанным выше флагам компилятора вы должны добавить:

-no_compact_linkedit

Здесь описано:

http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/ld.1.html

где написано:

Обычно при нацеливании на Mac OS X 10.6 компоновщик генерирует компактную информацию в сегменте __LINKEDIT. Эта опция заставляет компоновщик вместо этого производить традиционную информацию о перемещении.

Я узнал об этом в списке рассылки xcode-users о «неизвестной требуемой команде загрузки 0x80000022».

1 голос
/ 01 августа 2011

я смог решить эту проблему, передав -mmacosx-version-min=10.5 компоновщику , например, --extra-ldflags="-mmacosx-version-min=10.5" передано configure для ffmpeg, который я собирал. больше информации: http://lists.apple.com/archives/xcode-users/2009/Oct/msg00530.html

0 голосов
/ 11 июня 2010

Хорошо, ВТОРОЕ и не очень удачное решение - найти компьютер 10.5.8, установить пакеты для разработчиков и пересобрать ... то же самое для powerPC ... печально, но это будет работать ...

0 голосов
/ 18 сентября 2009

Оказывается, есть функция динамической загрузки библиотеки (0x22), которая была добавлена ​​в 10.5.6. Система, на которой я работал, была 10.5.5. Я обновился до 10.5.8, и все работает!

0 голосов
/ 18 сентября 2009

В зависимости от того, сколько библиотек вы используете, может быть сложно статически связать их все. Что вам говорит "otool -L your_binary"?

Чтобы получить автономный пакет для моего собственного приложения, я сделал пользовательскую установку MacPorts в нестандартном каталоге, чтобы я мог связываться с библиотеками из этого каталога и быть ограниченным, спрашивая людей. установить все это в одном месте на своих компьютерах. Не очень, совсем не дух Mac, но это приложение Unix, и вам все равно нужно быть знакомым с Unix, чтобы использовать его.

Удачи

Паскаль

...