mac - ¿Cómo debo gestionar las dependencias entre proyectos en un espacio de trabajo de Xcode?
xcode download (6)
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 compilación también muestra los esquemas de ambos proyectos. Ahora quiero agregar el objetivo libjson.a del proyecto json-framework como una dependencia del objetivo de la aplicación iOS en el otro proyecto. El resultado esperado es que cada vez que se construya el objetivo de la aplicación, se compila (si es necesario) el objetivo de la biblioteca y se vincula el objetivo 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 objetivo de mi aplicación, y en "Fases de compilació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 objetivo de la biblioteca, pero la construcción del objetivo 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 objetivo json como una dependencia explícita. Para probar esto, no modifico el esquema de compilación, sino que voy al editor de destino para el objetivo de mi aplicación y hago clic en el botón Agregar en ''Dependencias del objetivo''. No se muestran objetivos 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 objetivo de la biblioteca como una dependencia del objetivo 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 objetivos 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, anidados como se muestra.
Puede eliminar el proyecto hermano si ya lo tiene.
Golpear construir sobre esto y simplemente funciona, hasta donde puedo ver.
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.
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.
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 compilación''.
Todos los proyectos en un solo espacio de trabajo comparten un directorio de compilación. Las dependencias se descubren automáticamente y se crean si es necesario:
"Xcode examina los archivos en el directorio de compilació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 compilación no hace explícita esta dependencia. Si es necesario, puede anular tales dependencias implícitas con configuraciones de compilación explícitas. Para dependencias explícitas, debe crear referencias de proyectos ".
He tenido cierto éxito al crear bibliotecas estáticas similares a frameworks , aunque no es una solución perfecta.
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 objetivo. 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.
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 compilació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.
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 compilar automáticamente la lib, es decir, para crear la dependencia, puede usar la "Fase de compilació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 compila 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