как связать статическую библиотеку для iOS

я создал кучу файлов .o(через gcc -c $file.c $someotherops -o $file.o). Теперь я хочу связать их в статическую библиотеку.

Я не совсем уверен, следует ли использовать для этого ldили gcc. В руководстве ldсказано, что я не должен использовать его напрямую. Однако я не могу понять параметры gcc для создания статической библиотеки.

Я попробовал ld *.o -static -o libfoo.a, но он жалуется на большое количество отсутствующих символов (думаю, все из libc). Я не понимаю, почему он жалуется, потому что он должен быть статической библиотекой. Я думал, что он проверит символы, как только я свяжу эту статическую библиотеку с чем-то другим.

Еще одно: здесь я использую /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld(моя цель — iOS). Он жалуется с предупреждением ld: warning: using ld_classic. О чем это?

Тогда я подумал, может быть, нужно указать динамические библиотеки. Поэтому я добавил -lcдля ссылки на libc. Но он жалуется, что не может найти файл для: -lc. Я добавил -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/libи есть libc.dylib.

Есть идеи?


Об ошибке -lc: Она исчезла после того, как я указал -arch armv6. Затем он пожаловался на неправильный libcache.dylib(который должен быть связан с libc.dylib, я думаю, потому что это не указано). Добавление -L.../usr/lib/systemпомогло.

Теперь для каждого отдельного .oфайла я получаю предупреждение ld: warning: подтип CPU_SUBTYPE_ARM_ALL устарел. О чем это?

И у меня все еще есть куча отсутствующих символов, особенно:

Undefined symbols for architecture armv6:
  "start", referenced from:
     -u command line option
     (maybe you meant: _PyThread_start_new_thread)
  "___udivsi3", referenced from:
      _get_len_of_range in bltinmodule.o
      _quorem in dtoa.o
      _array_resize in arraymodule.o
      _newarrayobject in arraymodule.o
      _array_fromfile in arraymodule.o
      _get_len_of_range in rangeobject.o
      _inplace_divrem1 in longobject.o
      ...
  "___unorddf2", referenced from:
      _builtin_round in bltinmodule.o
  ...

Я проверил некоторые из этих символов, например. ___udivsi3в get_len_of_range. Эта функция использует только арифметику C, без внешнего вызова. Таким образом, это, кажется, переведено на использование некоторых внешних функций, таких как ___udivsi3. Но в каких библиотеках это находится?


-lgcc_s.1исправлено большинство отсутствующих символов ___udivsi3и связанных с ними. Символ startпо-прежнему отсутствует. Что означает параметр командной строки -u ?


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


Продолжая экспериментировать, arвыдает мне несколько предупреждений при создании объемной статической библиотеки. Это дало мне подсказку вместо этого использовать libtool. Это то, что я сейчас делаю, то есть libtool -static -o libfoo.a *.o. Также я переключил компилятор на /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang, но не уверен, что это имеет значение.

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

ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in __PyBuiltin_Init from /Users/az/Programmierung/python-embedded/libpython.a(bltinmodule.o). To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000004 (0x001B70CC) to 0x1001B70C4
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000000 (0x001B70CC) to 0x1001B70C4

О чем они? Я не использую -mdynamic-no-pic. Я также не вижу в _PyBuiltin_Initтого, как я использую там абсолютную адресацию.

Кроме того, что означают эти абсолютные адреса вне допустимого диапазона? Редактировать:Это были действительно огромные ассигнования. Я только что удалил этот код на данный момент (это был WITH_PYMALLOC, если кого-то интересуют эти конкретные внутренности Python).

Когда я запускаю его на своем iPhone, я получаю прерывание:

dyld: vm_protect(0x00001000, 0x00173000, false, 0x07) не удалось, результат = 2 для сегмента __TEXT в /var/mobile/Applications/C15D9525-E7DC -4463-B05B-D39C9CA24319/...

Когда я использую -no_pieдля связывания, он даже не связывается. Ошибка:

Недопустимое перемещение текста в ___stderrp в /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/libSystem.dylib из _read_object в /Users/az/Programmierung/python-embedded/libpython.a(marshal.o) для архитектуры armv7


я решил, что PIE отключен, ошибка абсолютной адресации. У меня было -staticв командной строке Clang. Как только я удалил это, предупреждение исчезло, как и ошибка dyld/vm_protect. Это был первый раз, когда он действительно запускал какой-то код.

Пока я не нажал еще одна странная ошибка при сравнении целых чисел.При этом это больше похоже на ошибку в их сборке Clang.

5
задан Community 23 May 2017 в 11:53
поделиться