ios cocoapods cross-compiling pjsip libtool-xcode

ios - No se puede crear una biblioteca dinámica para PJSIP



cocoapods cross-compiling (1)

Tenemos un script que compilará PJSIP en una biblioteca estática grande. Pero nos gustaría crear una biblioteca dinámica para que se pueda utilizar en proyectos de swift only.

Actualización del 9 de septiembre de 2016:

Al compilar PJSIP con la opción "--enable-shared", la mayoría de las librerías están compiladas correctamente. Sin embargo, algunas bibliotecas se compilan para la arquitectura incorrecta, en este caso x86_64 en lugar de 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

Considerando que estos son correctos:

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

Cuando empezamos a construir:

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

Al completar correctamente pero

+ make

genera estas advertencias:

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

y muchas advertencias parecidas a esto:

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

y:

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

¿Cuál podría ser la razón por la que algunas bibliotecas se compilan para la arquitectura correcta y otras no? ¿Cómo podría arreglar esto?

Para información de fondo, las variables de entorno impresas por 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: llamando a ./aconfigure con 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

Proceso inicial:

El proceso que tenemos hasta ahora es:

  1. cree una biblioteca estática grande para 1 arquitectura con los scripts de bash de PJSIP.
  2. extraer todo en archivos o separados con lipo y ar
  3. Tratando de hacer una librería dinámica con libtool.

Pero tenemos problemas con los enlaces a otros marcos (por lo que podemos decir). ¿Es este el caso o hacemos algo más mal?

Este es el paso 3 en detalle:

Tenemos todos los archivos de 1 arquitectura en 1 carpeta. Luego ejecutamos este comando libtool:

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

Inicio de nuestra salida después de ejecutar el comando:

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


Las bibliotecas compartidas se cargan en tiempo de ejecución. Por lo tanto, debe proporcionar la biblioteca con su aplicación y cargarla con dlopen (3) por usted mismo, ya que no puede instalarla en las rutas de la biblioteca del sistema. También debes codificar tu biblioteca.

Pero esto no tiene sentido:

  1. Las bibliotecas compartidas tienen sentido cuando las carga desde varias aplicaciones. En iOS, esto solo puede ser su aplicación y sus extensiones. Deberías usar un framework dinámico en su lugar.
  2. Apple probablemente rechazará tu binario, si detectan la biblioteca compartida, y apuntarán a marcos compartidos.

Incluir las librerías en un marco compartido debería ser fácil. Solo agregue las bibliotecas estáticas a los marcos y bibliotecas vinculados desde el marco compartido. Asegúrese de que las bibliotecas estáticas están compiladas para colocar código independiente, que debería ser el predeterminado.