2010-03-18 23 views
6

Me encuentro con algunas dificultades al agregar un marco a mi proyecto cuando ejecuto una aplicación de iPhone desde la línea de comandos. Mi objetivo final es ejecutar pruebas de aplicaciones desde un proceso de compilación automatizado.dyld: Biblioteca no cargada: cuando la aplicación se ejecuta desde la línea de comando

cuando corro mi aplicación de xCode:

agrego una "copia de archivos" fase de construcción a mi objetivo y todo va bien. La copia se establece en $ (BUILT_PRODUCTS_DIR) como "Ruta absoluta"

cuando corro mi aplicación desde el terminal (usando iphonesim proyecto) me sale este error:

dyld: Library not loaded: @rpath/OCMock.framework/Versions/A/OCMock 

UIKitApplication:indemnisation[0xb894][26380]  Referenced from: /Users/Admin/Library/Application Support/iPhone Simulator/User/Applications/CD5729B5-A674-49B2-91F6-AD398094B6F8/indemINT.app/indemINT 

Lo que yo no entiendo es que la fase de compilación de copias simplemente copia los archivos de marcos en el mismo directorio que la aplicación.

Cuando ejecuto la aplicación desde la línea de comandos, los archivos de marcos ya están en el mismo directorio. ¿Alguien sabe por qué no funciona?

También he intentado añadir la OCMock.framework en los siguientes directorios (sin éxito):

/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library 

/Library/Frameworks 

/Users/Admin/Library/Application Support/iPhone Simulator/User/Applications/CD5729B5-A674-49B2-91F6-AD398094B6F8 

Gracias de antemano, Vincent.

Respuesta

2

El iPhone no es compatible con los marcos de Mac OS X tradicionales. Si bien el iPhone usa carpetas que terminan en ".framework", estas carpetas están estructuradas de forma diferente a los marcos de Mac OS X típicos. En particular, los marcos de iPhone solo tienen permiso para usar bibliotecas estáticas, mientras que los marcos típicos de Mac OS X se cargan dinámicamente. Que el mensaje proviene de Dyld indica que estás usando una biblioteca compartida; sin embargo, las aplicaciones dirigidas al iPhone solo pueden estar vinculadas estáticamente.

+1

Y tenga en cuenta que si desea hacerlo para OSX, su destino debe establecerse en «Marco», sin subpaso, en su fase de compilación «Archivo de copia», por lo que el marco está incluido en su aplicación (tenerlo en la misma carpeta que la aplicación no es una solución). – Macmade

8

Acabo de tener este mismo error exacto en Xcode 4.2 (4D199) en Lion. Arrastré/solté la carpeta OCMock.framework en mi proyecto y seleccioné la casilla de verificación "copiar archivos". Vi las respuestas anteriores y me di cuenta de que olvidé agregar una fase de compilación "Copiar archivos" para colocar el marco en su lugar. Agregué uno y lo arrastré justo después de la fase de compilación de los archivos de compilación e intenté ejecutar nuevamente mis pruebas. No pude hacer que funcionara hasta que cambié el destino en la fase "Copiar archivos" al "Directorio de productos". El uso de "Frameworks" o "Shared Frameworks" no funcionó.

+0

¡Gracias por ese puntero! –

0

OCMock se distribuye como un marco, y el iPhone no le permite construir sus propios marcos arbitrarios (hay buenas razones para hacerlo en un dispositivo con solo 128 MB de RAM y sin intercambio).

La solución que veo en muchos lugares en la web es poner OCMock.framework en/Library/Frameworks o en cualquier otro lugar en las rutas de búsqueda de marcos estándar. Esta no es una solución muy buena: su sistema de construcción ahora depende del estado de su máquina en particular. No está bien.

Otra opción sería agregar la fuente de OCMock al objetivo de prueba de la unidad. Esto funcionaría, pero es innecesario, ya que las pruebas nunca se ejecutarán en el iPhone, 2 así que ¿por qué molestarse en construirlas para ARM? Los ejecutables creados para el simulador de iPhone, que son binarios de Mac OS X, pueden vincularse perfectamente con bibliotecas dinámicas. Podemos usar esto para nuestra ventaja.

Lo que sigue es lo que creo que es la mejor manera de conseguir OCMock trabajar con proyectos de iPhone:

En primer lugar, añadir OCMock.framework a su proyecto.Asegúrese de que esté siendo agregado a su objetivo de Pruebas unitarias, no a su aplicación.

A continuación, agregue una fase Copiar archivos a su objetivo de Pruebas unitarias. Configurarlo de esta manera:

Destino: Ruta absoluta Ruta Completa: $ (BUILT_PRODUCTS_DIR)

Ahora, OCMock.framework arrastre en su nueva fase de copia de archivos para añadirlo a la lista de archivos que desea copiar.

Finalmente, arrastre la fase Copiar archivos, que renombré a "Copiar OCMock", entre las fases Compilar fuentes y Vincular binario con bibliotecas.

Eso es todo! Ejecutar (y ejecutar me refiero a compilación) tus pruebas y todo debería funcionar correctamente.

Cuestiones relacionadas