2012-06-16 2 views
5

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

Я не совсем уверен, что я должен использовать 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. Но он жалуется на can't locate file for: -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 subtype is deprecated. О чем это?

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

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 command line option?


Из here, я получил такое ощущение, что, может быть, 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) failed, result=2 for segment __TEXT in /var/mobile/Applications/C15D9525-E7DC-4463-B05B-D39C9CA24319/...

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

Illegal text-relocation to ___stderrp in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/libSystem.dylib from _read_object in /Users/az/Programmierung/python-embedded/libpython.a(marshal.o) for architecture armv7


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

До тех пор, пока я не ударил another strange error about integer comparison. Таким образом, это больше похоже на ошибку в их сборке Clang.

+0

один вопрос; почему вы не создаете проект XCoe Static Library и не создаете статическую библиотеку с этим проектом? – CarlJ

+0

@meccan: Я хочу иметь собственный скрипт компиляции в этом случае по причинам varios (главным образом потому, что для этого конкретного проекта это намного проще сейчас). В любом случае, даже если бы я сделал это с Xcode, этот вопрос остается действительным/открытым, поскольку я хочу понять, как это сделать вручную. – Albert

+0

в порядке, и вы знаете, что вы можете построить проект Xcode из оболочки? – CarlJ

ответ

12

Все работает сейчас. В принципе, ответ:

  • Просто соберите все *.c файл как обычно *.o файлов. Единственное реальное отличие - это разные GCC/Clang, -arch armv7, различные SDK/include dirs.

  • Используйте libtool -static -o libfoo.a *.o для создания статической библиотеки.

Всё. Другие проблемы в моем вопросе были просто ошибочно поставлены.

1

Если кто-то получает здесь, выполнив ошибку dyld: vm_protect(...), но вы используете XCode, флаг -static, упомянутый в OP, скорее всего будет проблемой.

Избавьтесь от него, переключив «Включить связь с разделяемыми библиотеками» на «Да» (по умолчанию) в настройках языка компилятора LLVM. (Это удаляет GCC_LINK_WITH_DYNAMIC_LIBRARIES = NO из файла проекта).