Кросс-компилировать libgcrypt для iPhone? Ошибка компоновщика ... не может найти "fwrite" и "strerror"? - PullRequest
4 голосов
/ 25 октября 2009

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

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

В настоящее время я пытаюсь выполнить кросс-компиляцию libgpg-error. Сценарии конфигурации, которые я использовал ранее, работают прекрасно; процесс "./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-error: 1,7
  • libgcrypt: 1.4.4
  • libtasn1: 2.2
  • орешки: 2,8,4

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

Обновление

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

  • $ DEVROOT = "/Developer/Platforms/iPhoneOS.platform/Developer"
  • $ SDKROOT = "$ DEVROOT / SDKs / iPhoneOS $ VER.sdk"

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

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

Ответы [ 3 ]

0 голосов
/ 05 марта 2010

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

0 голосов
/ 07 ноября 2011

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

man compat

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

-mmacosx-version-min=10.3

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

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

0 голосов
/ 31 октября 2009

Обычно неразрешенный символ $ 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

как опция -L. Я предполагаю, что где-то там есть библиотека libSystem?

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

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

Edit:

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

Когда вы создали libgpg-error, я думаю, что это создаст файл

SRC / .deps / gpg_error-GPG-error.Po

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

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

Edit2:

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

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