2010-07-28 10 views
25

Me enfrenta con el doble enlace, que por un lado para una de las bibliotecas estáticas de terceros, mi aplicación de iPhone utiliza, el indicador del enlazador -toda_carga tiene que establecerse en la configuración del proyecto o destino de la aplicación; de lo contrario, la aplicación falla en el tiempo de ejecución al no encontrar algunos símbolos, llamados internamente desde la lib, por otra parte, la libreta estática de terceros no debe establecerse en el nivel de la aplicación, o la aplicación no se compilará gracias a un error de "enlace de símbolos duplicados". Para resolver este problema, ahora quiero usar force_load instant de load_all, ya que debido a la documentación hace lo mismo que all_load, pero solo para la ruta pasada o lib-file, en lugar de todas las libs. El problema con force_load es, no tengo ni idea, cómo pasar una ruta o archivo como parámetro con él, al pasarlo a través de xcode project- o target-settings. Todas las posibilidades de sintaxis que me vienen a la mente conducen a xcode pensando que es otra bandera del enlazador en lugar de un parámetro de la anterior, o el enlazador está lanzando errores relacionados con la sintaxis o la bandera simplemente no hace nada en comparación con no establecerse. También abrí el archivo .pbxproj en un editor de texto para editarlo manualmente a la sintaxis correcta de la línea de comando, pero cuando recargo el proyecto con xcode, cambia automáticamente la sintaxis para interpretar el parámetro para forzar_carga como un indicador separado.xcode project-/ target-settings-sintaxis para el indicador del enlazador force_load en iPhone

¿Alguien tiene una idea sobre este tema?

Thx, Kaiserludi.

+0

recompensa para cualquiera que pueda mostrar cómo hacer que force_load funcione. Básicamente, algunas de las bibliotecas de mi proyecto deben estar vinculadas con all_load; otros necesitan estar vinculados sin eso. –

Respuesta

18

Acabo de probar esto. He compilado un binario estático armv6, armv7 e i386 de PCRE para utilizarlo en mi proyecto de iPhone. Mi proyecto normalmente solo tiene mi biblioteca agregada al proyecto y eso enlaza bien. Así que desactivé la casilla de membresía objetivo para libpcre.a y la reconstruí. Como era de esperar, recibo un montón de errores de enlazador de símbolos faltantes para los símbolos pcre. Luego abrí la ventana de configuración de objetivos y edité la sección "Otras banderas de enlaces". Añadí:

-force_load lib/pcre/libpcre.a 

El directorio lib está en el mismo directorio que mi archivo project.xcodeproj.

Se vinculó bien, así que sé que el comando force_load funcionó (y puedo verlo agregado a los indicadores de compilación cuando xcode construye el archivo).

Espero que ayude.

Actualización:

También probé la adición de una biblioteca del sistema a la línea "Otras banderas Linker" de esta manera:

-force_load src/pcre/libpcre.a -force_load ${SDKROOT}/usr/lib/libz.dylib 

que funcionó también.

+1

Hmmmm, tengo una biblioteca con categorías.Si lo enlace con all_load, todo es genial. Si lo enlace sin all_load, enlaza OK, pero al ejecutarlo tiene errores cuando intenta llamar a los métodos de categoría. Si lo enlace con force_load directoryPath/release-iOS-internal-iphonesimulator/libraryname.a, aparece un error de símbolo duplicado. La versión que estoy construyendo es la versión de depuración; ¿Podría eso tener algo que ver con eso? –

+1

El comando force_load incluye su biblioteca. Si tiene un error de símbolo duplicado, probablemente tenga un símbolo duplicado en alguna parte. No estoy seguro de si esto podría causar un problema, pero ¿está incluida la biblioteca como miembro de su proyecto y también a través de force_load? Tal vez eso hace una diferencia con las categorías. ¿Tiene algún método de categoría con el mismo nombre ya definido en su proyecto? También puedes mirar la ventana de resultados de compilación en xcode, seleccionar "mostrar todos los mensajes", luego hacer clic en el comando de enlace para obtener la línea de comando y luego jugar con eso en la terminal. – par

+0

Según http://wiki.phonegap.com/w/page/Upgrade-your-PhoneGap-Xcode-Template-for-3rd-Party-Library-Linkage-Problems, parece que estás usando la bandera correctamente . También creo que tienes una clase o categoría con el mismo nombre de la biblioteca a la que estás vinculando ... –

1

Acabo de agregar force_load a nuestro proyecto y todo está bien usando la sintaxis más simple posible. La biblioteca es una dependencia construida en el mismo proyecto. Por lo tanto, la biblioteca se incluye en la línea de comando del enlace dos veces: una como un archivo de entrada normal y una como argumento para -force_load. Es posible que desee poner caracteres de cita alrededor del argumento.

De hecho, incluso he conseguido que funcione usando configuraciones dependientes de la configuración (porque la ruta es obviamente diferente para la depuración frente a la versión y el dispositivo frente al simulador).

Buena suerte.

+0

En realidad, la razón , que force_load no funcionaba para mí, fue que agregué comillas. La eliminación de las comillas conduce a Xcode dividiéndolo en dos líneas, pero hace que funcione, cuando se pasa del IDE al compilador. Con comillas, se muestra correctamente en el IDE, pero el compilador no puede manejarlo de esa manera. – Kaiserludi

Cuestiones relacionadas