Невозможно создать динамическую библиотеку для PJSIP

У нас есть скрипт, который скомпилирует PJSIP в толстую статическую библиотеку. Но мы бы хотели создать динамическую библиотеку, чтобы ее можно было использовать только в быстрых проектах.

Обновление 9 сентября 2016 года:

При компиляции PJSIP с опцией "--enable-shared" большинство библиотек собираются правильно. Однако некоторые библиотеки компилируются для неправильной архитектуры, в данном случае x86_64 вместо arm64

libg7221codec.dylib is architecture: x86_64
libgsmcodec.dylib is architecture: x86_64
libilbccodec.dylib is architecture: x86_64
libresample.dylib is architecture: x86_64
libyuv.dylib is architecture: x86_64

Тогда как это правильно:

libpjsip.dylib is architecture: arm64
libpjsua.dylib is architecture: arm64
libpjsua2.dylib is architecture: arm64

Когда мы начнем строить:

+ ./configure-iphone --enable-shared
+ make dep
+ make clean

все правильно, но

+ make

генерирует эти предупреждения:

ld: warning: -undefined dynamic_lookup is deprecated on iOS
ld: warning: -flat_namespace is deprecated on iOS

и много предупреждений выглядит так:

ld: warning: ignoring file
output/libilbccodec-arm64-apple-darwin_ios/iLBC_decode.o, file was built
for unsupported file format ( 0xCF 0xFA 0xED 0xFE 0x0C 0x00 0x00 0x01 0x00
0x00 0x00 0x00 0x01 0x00 0x00 0x00 ) which is not the architecture being
linked (x86_64): output/libilbccodec-arm64-apple-darwin_ios/iLBC_decode.o
ld: warning: ignoring file
output/libg7221codec-arm64-apple-darwin_ios/common/common.o, file was built
for unsupported file format ( 0xCF 0xFA 0xED 0xFE 0x0C 0x00 0x00 0x01 0x00
0x00 0x00 0x00 0x01 0x00 0x00 0x00 ) which is not the architecture being
linked (x86_64): output/libg7221codec-arm64-apple-darwin_ios/common/common.o

а также:

ld: warning: ignoring file /pjsip/src/third_party/lib/libg7221codec.dylib,
file was built for x86_64 which is not the architecture being linked
(arm64): /pjsip/src/third_party/lib/libg7221codec.dylib

Что может быть причиной того, что некоторые библиотеки скомпилированы для правильной архитектуры, а некоторые нет? Как бы я мог это исправить?

Для справочной информации, переменные среды как напечатано configure-iphone:

configure-iphone: DEVPATH is not specified, using
/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
configure-iphone: IPHONESDK is not specified, choosing iPhoneOS9.3.sdk
configure-iphone: CC is not specified, choosing
/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/../../../Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
configure-iphone: CXX is not specified, using
/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/../../../Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

configure-iphone: вызов./aconfigure с env vars:

CC =
/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/../../../Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
 CXX =
/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/../../../Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
 SDKPATH =
/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk
 CFLAGS = -miphoneos-version-min=9.0 -DPJ_SDK_NAME="\"iPhoneOS9.3.sdk\""
-arch arm64 -isysroot
/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk
 LDFLAGS = -O2 -arch arm64 -isysroot
/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk
-framework AudioToolbox -framework Foundation
 AR =
/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/../../../Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool
-static -o
 RANLIB = echo ranlib
 ARCH = arm64

Начальный процесс:

Процесс, который мы имеем до сих пор:

  1. создайте толстую статическую библиотеку для 1 архитектуры с помощью сценариев PJSIP bash.
  2. распаковать все в отдельные файлы с помощью lipo и ar
  3. пытаюсь сделать динамическую библиотеку с помощью libtool.

Но у нас есть проблемы со ссылками на другие фреймворки (насколько мы можем судить). Это так или мы делаем что-то еще не так?

Это шаг 3 в деталях:

У нас есть все файлы 1 архитектуры в 1 папке. Затем мы запускаем эту команду libtool:

libtool -dynamic *.o -o pjsip.dylib -framework AudioToolbox -framework Foundation -framework AVFoundation -framework CoreFoundation -lSystem -ios_version_min 9.0

Начало нашего вывода после запуска команды:

    ld: warning: -force_cpusubtype_ALL will become unsupported for ARM architectures
Undefined symbols for architecture armv7s:
  "_AVAudioSessionCategoryPlayAndRecord", referenced from:
      _ca_factory_init in coreaudio_dev.o
  "_AVAudioSessionModeVoiceChat", referenced from:
      _ca_factory_init in coreaudio_dev.o
  "_AudioComponentFindNext", referenced from:
      _ca_factory_init in coreaudio_dev.o
      _ca_stream_set_cap in coreaudio_dev.o
  "_AudioComponentGetDescription", referenced from:
      _ca_stream_get_cap in coreaudio_dev.o
  "_AudioComponentInstanceDispose", referenced from:
      _ca_stream_destroy in coreaudio_dev.o
  "_AudioComponentInstanceNew", referenced from:
      _create_audio_unit in coreaudio_dev.o
  "_AudioConverterDispose", referenced from:
      _ca_stream_destroy in coreaudio_dev.o
      _ilbc_dealloc_codec in ilbc.o
  "_AudioConverterFillComplexBuffer", referenced from:
      _resample_callback in coreaudio_dev.o
      _ilbc_codec_encode in ilbc.o
      _ilbc_codec_decode in ilbc.o
      _ilbc_codec_recover in ilbc.o
  "_AudioConverterNew", referenced from:
      _ilbc_codec_open in ilbc.o
  "_AudioConverterReset", referenced from:
      _ca_stream_start in coreaudio_dev.o
  "_AudioFormatGetProperty", referenced from:
      _ilbc_codec_open in ilbc.o
  "_AudioOutputUnitStart", referenced from:
      _ca_stream_start in coreaudio_dev.o
  "_AudioOutputUnitStop", referenced from:
      _ca_stream_start in coreaudio_dev.o
      _ca_stream_stop in coreaudio_dev.o
  "_AudioUnitInitialize", referenced from:
      _create_audio_unit in coreaudio_dev.o
  "_AudioUnitRender", referenced from:
      _resample_callback in coreaudio_dev.o
      _input_callback in coreaudio_dev.o
  "_AudioUnitSetProperty", referenced from:
      _create_audio_unit in coreaudio_dev.o
  "_AudioUnitUninitialize", referenced from:
      _ca_stream_destroy in coreaudio_dev.o
  "_CFArrayGetCount", referenced from:
      _pj_getaddrinfo in addr_resolv_sock.o
  "_CFArrayGetValueAtIndex", referenced from:
      _pj_getaddrinfo in addr_resolv_sock.o
  "_CFDataGetBytePtr", referenced from:
      _pj_getaddrinfo in addr_resolv_sock.o
  "_CFHostCreateWithName", referenced from:
      _pj_getaddrinfo in addr_resolv_sock.o
  "_CFHostGetAddressing", referenced from:
      _pj_getaddrinfo in addr_resolv_sock.o
  "_CFHostStartInfoResolution", referenced from:
      _pj_getaddrinfo in addr_resolv_sock.o
  "_CFReadStreamClose", referenced from:
      _activesock_destroy_iphone_os_stream in activesock.o
  "_CFReadStreamOpen", referenced from:
      _activesock_create_iphone_os_stream in activesock.o
  "_CFReadStreamSetProperty", referenced from:
      _activesock_create_iphone_os_stream in activesock.o
  "_CFRelease", referenced from:
      _activesock_destroy_iphone_os_stream in activesock.o
      _pj_getaddrinfo in addr_resolv_sock.o
  "_CFStreamCreatePairWithSocket", referenced from:
      _activesock_create_iphone_os_stream in activesock.o
  "_CFStringCreateWithCStringNoCopy", referenced from:
      _pj_getaddrinfo in addr_resolv_sock.o
  "_Gsm_LPC_Analysis", referenced from:
      _Gsm_Coder in code.o
  "_Gsm_Preprocess", referenced from:
      _Gsm_Coder in code.o
  "_OBJC_CLASS_$_AVAudioSession", referenced from:
      objc-class-ref in coreaudio_dev.o
  "_OBJC_CLASS_$_UIDevice", referenced from:
      objc-class-ref in os_info_iphone.o
  "__DefaultRuneLocale", referenced from:
      __Z8__istypeim in siptypes.o

1 ответ

Общие библиотеки загружаются во время выполнения. Таким образом, вы должны предоставить библиотеке свое приложение и загрузить его dlopen(3) самостоятельно, потому что вы не можете установить его в пути к системным библиотекам. Вы также должны кодировать свою библиотеку.

Но это не имеет смысла:

  1. Совместно используемые библиотеки имеют смысл, когда вы загружаете их из нескольких приложений. На iOS это может быть только ваше приложение и его расширения. Вместо этого вы должны использовать динамический фреймворк.
  2. Apple, вероятно, отклонит ваш двоичный файл, если они обнаружат разделяемую библиотеку, и они укажут на совместно используемые платформы.

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

Другие вопросы по тегам