¿Cómo debo gestionar las dependencias entre proyectos en un espacio de trabajo de Xcode?

Estoy trabajando en un proyecto de aplicación para iOS y agregué el proyecto json-framework al área de trabajo. El navegador del proyecto a la izquierda muestra ambos proyectos, y el selector de esquema de comstackción también muestra los esquemas de ambos proyectos. Ahora quiero agregar el objective libjson.a del proyecto json-framework como una dependencia del objective de la aplicación iOS en el otro proyecto. El resultado esperado es que cada vez que se construya el objective de la aplicación, se comstack (si es necesario) el objective de la biblioteca y se vincula el objective de la aplicación. Estas son las formas en que he tratado de hacer esto:

  • Construya ambos como parte del mismo esquema. La forma en que trato de hacerlo es editando el esquema de mi aplicación, agregando ‘libjson.a’ a la parte ‘Build’ del esquema, y ​​por cierto “Find Implicit Dependencies” está marcado. Luego voy al editor de destino para el objective de mi aplicación, y en “Fases de comstackción” -> “Enlace binario con bibliotecas”, elijo “libjson.a” de la lista de bibliotecas del espacio de trabajo. Cuando posteriormente trato de construir el esquema, veo que construye el objective de la biblioteca, pero la construcción del objective de la aplicación falla con el error del vinculador “Biblioteca no encontrada para -ljson”, lo que sugiere que realmente no se ha descubierto que la biblioteca ha sido construida. De hecho, en el navegador del proyecto, la entrada en el proyecto de la aplicación para la biblioteca sigue siendo roja, lo que indica que el archivo no existe.

  • Agregue el objective json como una dependencia explícita. Para probar esto, no modifico el esquema de comstackción, sino que voy al editor de destino para el objective de mi aplicación y hago clic en el botón Agregar en ‘Dependencias del objective’. No se muestran objectives de otros proyectos en el espacio de trabajo, por lo que este no es un comienzo.

  • Arrastre el proyecto JSON al otro proyecto y luego agregue el destino como una dependencia. Esto es lo que habría hecho en Xcode 3. En el navegador del proyecto, cojo el proyecto de la biblioteca y lo arrastro sobre el proyecto de la aplicación. Esto abre el panel habitual de “agregar archivos”, que simplemente descarto haciendo clic en “Finalizar”. Ahora hay dos entradas para el proyecto de la biblioteca en el navegador del proyecto: una en el nivel superior y otra en el proyecto de la aplicación. Ahora puedo agregar el objective de la biblioteca como una dependencia del objective de la aplicación usando el editor de destino, y puedo vincularlo sin error en la fase de bibliotecas de enlaces. Pero parece roto: hay múltiples entradas para el mismo proyecto en el navegador. ¿Hay alguna manera diferente de hacer esto?

¿Qué se debe considerar la forma “Xcode 4-ish” de conectar estos objectives en diferentes proyectos en el mismo espacio de trabajo? Parecería que falta si varios proyectos en el mismo espacio de trabajo no pueden interactuar entre sí. Gracias, Graham.

Acabo de configurar un proyecto de prueba, como describió en la versión 3, al crear un nuevo espacio de trabajo y arrastrar los dos proyectos de Xcode en él, nesteds como se muestra.

Puede eliminar el proyecto hermano si ya lo tiene.

Golpear construir sobre esto y simplemente funciona, hasta donde puedo ver.

Configuración del esquemaDiseño del proyecto

Imagino que hay una confusión de ruta interna si tienes dos proyectos, y me inclinaría a jugar con la configuración de ubicación en “Ver” -> “Utilidades” -> “Inspector de archivos” y ver qué efecto tiene.

enter image description hereenter image description here

Otra cosa que debes probar es establecer tus rutas en Xcode “Preferencias …” -> “Árboles de origen” y referirnos a ellos de esa manera, como se describe aquí: Fácil, uso compartido de código modular en aplicaciones de iPhone: Bibliotecas estáticas y referencias de proyectos cruzados

HTH. Andy W.

Logré que las dependencias entre proyectos en un área de trabajo funcionaran como describí aquí: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/ .

Lamentablemente, no puedo encontrar la forma de que Xcode descubra dependencias implícitas o indexe todo en la comstackción como se anuncia. Encontré una solución para ambos, pero espero que se necesite menos configuración manual a medida que Xcode 4 madure.

Iba a hacer la misma pregunta, pensando que mi propia solución no podía ser la correcta. Pero no lo veo mencionado aquí, y parece funcionar. Claramente XCode 4 es un trabajo en progreso. 🙂

Tengo un espacio de trabajo con dos proyectos: una biblioteca estática y una aplicación que usa la biblioteca. Los proyectos son hermanos. Cada proyecto tiene su propio esquema, y ​​cada esquema está configurado para construir solo un objective. En otras palabras, agregué dos proyectos al espacio de trabajo y eso es todo.

Para agregar la biblioteca estática como una dependencia de la aplicación, simplemente arrastro el producto libsomething.a desde el proyecto de la biblioteca (Project Navigator) a la lista “Enlace binario con bibliotecas” para el destino de la aplicación. Eso es. Ahora cuando construyo la aplicación, el proyecto de la biblioteca se construye primero y luego se vincula. Curiosamente, cuando modifico el esquema de la aplicación para usar una configuración diferente (por ejemplo, Release en lugar de Debug), la biblioteca se genera utilizando la misma configuración.

Entonces funciona, y claramente hay una verificación de dependencia automática aquí. Pero se siente mal. Por otra parte, también lo hace el esquema modal editor / administrador y la falta de un objeto de espacio de trabajo en el navegador del proyecto … Nunca pensé que lo diría, pero la interfaz de usuario de Visual Studio (bleh) es mucho más clara.

Mi solución a prueba de balas para hacer esto:

Cree las configuraciones “Per Debug-Release / Per Architecture” en Build Settings en el proyecto Main (no en la lib), para incluir ../MyLibProject/build/Debug-iphoneos o ../MyLibProject/build/Release-iphonesimulator o etc. ..
dependiendo de la configuración (puede crear ese tipo de configuración haciendo clic en + al lado de Depurar o Versión y elegir “Cualquier iOS SDK Simulador” o “cualquier iOS SDK”. Debe hacer eso para ambos “Ruta de búsqueda de encabezado” (en caso de que su biblioteca copie algunos archivos de encabezados, lo que es más que probable) Y para “Rutas de búsqueda de bibliotecas”. Lo que significa que para cada configuración, probablemente terminará con 4 rutas diferentes (depuración sim, depuración ios, lanzamiento sim, release ios). Eso aseguraría que la configuración de ambos proyectos coincida.

Ahora, para comstackr automáticamente la lib, es decir, para crear la dependencia, puede usar la “Fase de comstackción -> Enlace a binario con bibliotecas -> + -> seleccione el archivo .a” que se proporciona más arriba.

Esa es la única forma en que logré tener algo que comstack y enlace correctamente para cada entorno en xcode 4.5

Nota: Incluso agregué el distintivo -lmyLib en “otros indicadores de enlazador”, pero no estoy seguro de que sea realmente necesario

He tenido cierto éxito al crear bibliotecas estáticas similares a frameworks , aunque no es una solución perfecta.

Consulte la guía de usuario de Xcode: Conceptos de Xcode -> Espacio de trabajo de Xcode en ‘Proyectos en un espacio de trabajo Comparta un directorio de comstackción’.

Todos los proyectos en un solo espacio de trabajo comparten un directorio de comstackción. Las dependencias se descubren automáticamente y se crean si es necesario:

“Xcode examina los archivos en el directorio de comstackción para descubrir dependencias implícitas. Por ejemplo, si un proyecto incluido en un espacio de trabajo crea una biblioteca que está vinculada por otro proyecto en el mismo espacio de trabajo, Xcode construye automáticamente la biblioteca antes de construir el otro proyecto. incluso si la configuración de comstackción no hace explícita esta dependencia. Si es necesario, puede anular tales dependencias implícitas con configuraciones de comstackción explícitas. Para dependencias explícitas, debe crear referencias de proyectos “.

    Intereting Posts