¿Cuál es la forma correcta de configurar las áreas de trabajo de XCode 4 para crear dependencias cuando sea necesario?

Mi caso es simple, un espacio de trabajo con dos proyectos hermanos: una aplicación principal (iOS) y un proyecto que construye varios objectives de biblioteca estática utilizados por la aplicación.

Así es como he configurado la comstackción:

  • apuntó una ‘ruta de búsqueda de encabezado de usuario’ en la configuración de comstackción de la aplicación principal a la ubicación del proyecto de biblioteca (a través de un árbol de fuente)
  • en el editor del objective principal de mi aplicación -> fases de comstackción -> sección “Enlace binario con bibliotecas”, agregué los productos de la biblioteca que deseo usar.
  • en el esquema, marcó ‘Encontrar dependencias implícitas’

Después de una limpieza (y eliminación de los datos derivados), una comstackción me redirecciona este error durante la comstackción del proyecto principal:

ld: library not found for -lChipmunk clang: error: linker command failed with exit code 1 (use -v to see invocation) Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1 

Efectivamente, si miro los datos derivados recién creados, los únicos archivos de objeto que se encuentran son para la aplicación principal, no para las bibliotecas. Un ‘hallazgo’ generalizado para archivos * .o no revela nada relevante, por lo que las bibliotecas no se pierden, definitivamente no se están construyendo.

Algunos puntos suplementarios:

  • cuando pregunté sobre esto en los foros de desarrollo de Apple, se sugirió que debería agregar deps explícitos en el editor Build Facts-> Target Dependencies del objective principal. Pero solo puede agregar déps aquí a los objectives en el mismo proyecto o subproyectos; en mi caso, tengo la aplicación y los proyectos de la biblioteca como hermanos en el lugar de trabajo.
  • si construyo cada biblioteca manualmente antes de la comstackción principal, todo está bien.

Actualizar:

Acabo de encontrar una solución, que es agregar todos los objectives de las deps en la parte de ‘comstackción’ del esquema de la aplicación principal. Ya había intentado esto sin éxito, pero no me había dado cuenta de que podía arrastrar los objectives por la lista para obtener el orden de comstackción correcto. Las comstackciones ahora suceden en el orden correcto, tanto después de una limpieza como después de los cambios en la biblioteca o en la fuente principal de la aplicación.

Dejo la pregunta aquí, porque ordenar manualmente una orden de comstackción seguramente no debería ser necesario. Tiene que haber algo mal con la forma en que he configurado las cosas.

Editar el esquema (intercambiar objectives de comstackción, anular / verificar “Parallelize Build” y / o “Find Implicit Dependencies”) no me funcionaba. Todavía tuve que limpiar comstackr el proyecto, después de cualquier cambio de código en la lib estática. Buscando en los foros de desarrollo, finalmente encontré esta respuesta , que funcionó de maravilla.

Asegúrese de que se muestre el inspector de Identidad y Tipo y seleccione el archivo libWhatever.a en el proyecto de su aplicación (no la biblioteca). Si ve la Ubicación: Relativo al Proyecto [o Relativo al Grupo], este es su problema.

  1. Haga clic en Relativo al proyecto y cámbielo a Relativo para comstackr productos.
  2. Esto cambiará el tipo de enlace, pero aún se romperá.
  3. Haga clic en el botón localizar y encuentre el archivo de salida.

Agregar una lib estática a un proyecto existente a través de Build Fases -> Link Binary with Libraries lo convierte automáticamente en “Relative to Group” (si ambos son hermanos en el mismo espacio de trabajo). Cambiar su ubicación de la manera descrita arriba resuelve el problema de dependencia de la comstackción y en el navegador del proyecto su archivo .a debe aparecer en letras negras (en lugar de rojo).

Describí la forma en que he estado configurando varios proyectos en un espacio de trabajo aquí: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/

Estoy de acuerdo en que ajustar manualmente el orden de generación en el esquema debería ser innecesario, según la documentación de Xcode, pero esa es la mejor solución que he encontrado hasta ahora.


Editar: Siempre que sea posible, recomiendo usar https://github.com/CocoaPods/CocoaPods para administrar las dependencias del proyecto en este punto.

Intente arrastrar el proyecto de la biblioteca al proyecto principal:

referencia del proyecto de la biblioteca dentro del proyecto principal

En mi caso, la única forma en que podría tener esa comstackción de configuración de hermanos es agregar manualmente la ruta “../MyLibProject/build/Debug-iphoneos” (verificando recursivo solo para asegurarse) en mi Configuración de comstackción -> Rutas de búsqueda de bibliotecas. Agregar el archivo .a solo en el proyecto principal no impidió el error “lib no encontrado” en el momento del enlace.