Кросс-компиляция libgcrypt для iPhone?Ошибка компоновщика ... похоже, не удается найти “fwrite” и “strerror”?

StackOverflow https://stackoverflow.com/questions/1620375

Вопрос

Я успешно перекрестная компиляция Apache Portable Runtime (APR) для iPhone, используя набор настройка скриптов которые вызывают GNU Autotools "./configure" с необходимыми параметрами кросс-компиляции.

Сейчас я пытаюсь кросс-скомпилировать GNUTLS, который зависит от libtasn1 и libgcrypt, который, в свою очередь, зависит от libgpg-error.Вот тут-то я и столкнулся с неприятностями, и мне могла бы понадобиться ваша помощь...

В настоящее время я пытаюсь кросс-скомпилировать libgpg-ошибка.Скрипты настройки, которые я использовал ранее, работают прекрасно;процесс "./configure" завершается чисто.Проблемы возникают, когда я запускаю "make".Когда я запускаю make, кажется, что все компилируется, но затем я получаю следующую неприятную ошибку компоновщика в конце:

/bin/sh ../libtool --tag=CC   --mode=link /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2  -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include  -arch armv6 --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o  ./libgpg-error.la  
/Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include -arch armv6 --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o  -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib ./.libs/libgpg-error.a
Undefined symbols:
  "_fwrite$UNIX2003", referenced from:
      _main in gpg_error-gpg-error.o
  "_strerror$UNIX2003", referenced from:
      _gpg_strerror in libgpg-error.a(libgpg_error_la-strerror.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[3]: *** [gpg-error] Error 1
make[2]: *** [all] Error 2
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

Есть какие-нибудь идеи о том, как заставить это работать?Версии программного обеспечения, которое я компилирую, следующие:

  • libgpg-ошибка:1.7
  • libgcrypt - шифрование:1.4.4
  • libtasn1:2.2
  • гнутлы:2.8.4

Пожалуйста, помогите.Спасибо.

Обновить

Согласно первоначальному отзыву, каждый SDK имеет копию "libSystem.dylib" в "$SDKROOT/usr/lib".В "$DEVROOT/usr/lib" нет копии libSystem, где:

  • $DEVROOT = "/Разработчик/Платформы/iPhoneOS.platform/Разработчик"
  • $SDKROOT = "$DEVROOT/SDKs/iPhoneOS$ВЕРСИЯsdk"

Библиотеки "libSystem" содержат обычные, недекорированные версии каждого символа, но не содержат вариантов символов "$UNIX2003".Я подозреваю, что GPG-ERROR определяет "_POSIX_C_SOURCE", "_UNIX" или другой макрос тестирования функций UNIX, и что включается мошеннический заголовок, который добавляет "$ UNIX2003" к функциям, когда присутствуют эти макросы тестирования функций.Удаление "$DEVROOT /usr/include" из списка включенных каталогов не влияет на удаление этого сообщения об ошибке.

В качестве последнего средства я вижу, что "ld" принимает опцию "-alias_list", которая позволяет указать файл с записями типа "_fwrite _fwrite $ UNIX2003", чтобы принудительно преобразовать эти неопределенные символы в их недекорированные варианты.Если возможно, я хотел бы избежать этого варианта, поскольку он кажется хакерским и потенциально опасным.

Это было полезно?

Решение

Обычно неразрешенный символ $UNIX2003 означает, что вы связывание с более старым SDK, чем тот, на основе которого были созданы существующие объектные файлы.

Один странно выглядящий для меня путь включения, и, пожалуйста, обратите внимание, что я лишь смутно знаком с разработкой Mac и совсем не с разработкой iPhone, - это путь

/Developer/Platforms/iPhoneOS.platform/Developer/usr/include

которого на самом деле нет в папке SDK.Возможно ли, что вы позаимствовали оттуда мошеннические символы, если это так, если это они?Кажется маловероятным, поскольку это происходит позже в командной строке, чем пути включения SDK.

Возможно, вместо этого символы являются ожидаемыми версиями _fwrite и _strerror и вот gpg_error-gpg-error.o и libgpg-error.a все в порядке, и это действительно проблема со связыванием, хотя, опять же, маловероятно, поскольку у вас есть

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib

как вариант a - L.Я предполагаю, что где-то там есть libSystem dylib?

Я думаю, первое, что нужно сделать, это выяснить, соответствует ли версия символа UNIX2003 вашим ожиданиям или нет.Я предполагаю, что это так, но, как я уже сказал, я могу совершенно ошибаться.:)

Во-вторых, вы могли бы попробовать получить подробный вывод из ld чтобы увидеть, где он находит символы.Я уверен, что есть переменная окружения, которую вы можете установить, чтобы это произошло, но я не вижу ни одной из перечисленных на он-лайн справочной странице для ld. (Обновить:Двумя переменными env являются LD_TRACE_ARCHIVES и LD_TRACE_DYLIBS но, возможно, они дают то же самое, что и -t?).

Редактировать:

Итак, я был совершенно неправ насчет того, что символы UNIX2003 были именно теми, которые были необходимы.лол.

Когда вы создали libgpg-ошибка, я думаю, что она создала файл

src/.deps/gpg_error-gpg-ошибка.Po

который содержит зависимости заголовков (по крайней мере, так было в моей системе Linux).Это может дать ключ к пониманию того, где он взял неправильный заголовок при создании gpg_error-gpg-error.o.

Кстати, похоже, что скрипт настройки libgpg-error принимает оба -isysroot и -archОпции.Разве вы не можете использовать их вместо своей собственной версии скрипта configure?

Редактировать 2:

Ладно, давайте попробуем еще раз :) Вот несколько вещей, которые можно попробовать, начиная с чистой исходной папки:

  • используйте -isysroot вместо --sysroot
  • используйте -isysroot , а также --sysroot
  • временно сделайте ваши обычные системные заголовки недоступными, например, переименовав папку.Надеюсь, сборка завершится неудачно, не сумев найти заголовок, и он точно подскажет вам, где именно.

Другие советы

Попробуйте предварительно обработать gpg_error-gpg-error.c с помощью -E, затем выполните поиск отсутствующих символов.Вы должны найти, откуда есть inclued (что-то вроде asm ("_" "nice" "@UNIX2003").Затем измените этот заголовок (например, unistd.h, чтобы добавить #warning "HERE").Теперь перекомпилируйте, и вы должны найти включаемый стек.

Суффикс $2003 генерируется компилятором при некоторых обстоятельствах, которые вы можете найти полностью документированными в ручном вводе для compat

man compat

Я боролся с этим некоторое время, прежде чем окончательно исправить это, установив

-mmacosx-version-min=10.3

Любая версия, предшествующая версии 10.4, выполнит эту работу.Я подозреваю, что, учитывая ответ Трубадура, мне, возможно, будет лучше искать ошибочно связанные библиотеки, используя опцию -t ld

Надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top