theme night mojave mac enable darkmode dark ios4 xcode4
DependenciesInXcode4.zip

ios4 - night - ¿Cómo se obtienen dependencias implícitas para trabajar con espacios de trabajo en Xcode 4?



xcode 10 night mode (6)

Acabo de pasar la mejor parte de dos días construyendo y reconstruyendo nuestro proyecto, luchando con este mismo problema. Aunque ahora tengo un proyecto que construye y enlaza correctamente Y tiene codeense en funcionamiento, no estoy 100% contento con uno de los pasos, ya que parece ser un truco y ciertamente no se ajusta a mi concepto de "Dependencias implícitas automáticas". .

FWIW aquí están los pasos que tomé:

  1. Crea un nuevo espacio de trabajo en Xcode.
  2. Agregue un nuevo proyecto al espacio de trabajo para su biblioteca estática. También puede agregar un proyecto existente, encontré que esto también funciona.
  3. Pruebe que la biblioteca se cree como se espera.
  4. Agregue un nuevo proyecto al espacio de trabajo para su proyecto principal. Nuevamente logré agregar uno existente, pero lo más importante es que ya no tenía ninguna configuración de compilación vinculada a la biblioteca. Si agrega un nuevo proyecto, es bastante fácil simplemente agregarle archivos fuente existentes. Mi situación particular se complicó por un gran repositorio SVN preexistente que no quería reestructurar.
  5. En esta etapa, voy a suponer que su código fuente ya contiene importaciones de encabezados de la biblioteca estática.
  6. En las fases de compilación para el proyecto principal, expanda la sección "enlace binario con bibliotecas" y haga clic en el símbolo +. Seleccione el objetivo de su proyecto de biblioteca estática.
  7. Si lo desea, en esta etapa puede compilar el proyecto principal para confirmar que falla, como se muestra en las capturas de pantalla OP con errores "No such file ..." para las importaciones de encabezado.
  8. Ahora esta es la parte que realmente no me gusta. En tu proyecto principal, crea un nuevo grupo y llámalo Dependent Headers o lo que sea. Ahora, en el navegador del proyecto, arrastre los encabezados utilizados desde su proyecto estático a este nuevo grupo. En las opciones emergentes, simplemente lo dejé como la configuración predeterminada.
  9. También puede necesitar vincular su proyecto principal con cualquier biblioteca dependiente utilizada por su biblioteca estática. Por ejemplo, mi biblioteca estática hace uso de libxml2 y CFNetwork y aunque mi proyecto principal no los usa directamente, tuve errores de compilación si no los añadía a la fase de compilación "binario de enlace con bibliotecas".
  10. Tu proyecto principal debería (ahora) construir.

Realmente no me gustan los pasos 8 y 9. Esto realmente parece que XCode no está haciendo lo que se anuncia que hace. Sin embargo, si y cuando se soluciona, al menos estos pasos son bastante fáciles de realizar para que funcionen correctamente.

Creo que las "dependencias implícitas" deberían funcionar sin necesidad de pasar del paso 6, tal vez incluso del paso 5, pero eso podría ser un poco demasiado automágico para el gusto de mucha gente.

Quiero administrar proyectos en espacios de trabajo utilizando Xcode 4 con proyectos de biblioteca estática Cocoa Touch que contengan código compartido que podría hacer referencia de otros proyectos. De acuerdo con los videos de la WWDC 2010 y la documentación de Xcode 4, hay una función para "dependencias implícitas" para espacios de trabajo en Xcode 4. He estado tratando de hacerlo funcionar y no estoy teniendo mucho éxito.

Espacio de trabajo de ejemplo: DependenciesInXcode4.zip

Puede ver que el proyecto de muestra muy básico tiene 2 proyectos de biblioteca estática que denominé Biblioteca1 y Biblioteca2. Luego tengo una sola clase en cada proyecto al que hago referencia desde el proyecto de iPhone llamado PrimaryApp. Obtengo soporte de Code Sense al agregar el extracto de importación pero falla la compilación.

Puede ver cómo falla la compilación porque no puede encontrar las dependencias.

Para resolver estos problemas, agregué vinculados manualmente los proyectos de Library1 y Library2.

También tuve que agregar la ruta a estos proyectos como rutas de búsqueda de encabezado.

Ahora cuando construyo ambas bibliotecas de dependencia y luego ejecuto PrimaryApp en el simulador de iPhone, se compila correctamente y se ejecuta. He descubierto que no siempre garantiza que los proyectos de dependencia se construyan cuando sea necesario, y este es claramente un proceso manual. Esto no es lo que considero "dependencias implícitas" ya que los videos y la documentación de Xcode implican que debería funcionar. He estado buscando ejemplos más concretos, pero hasta ahora no he tenido suerte. Incluso aquí en Stackoverflow, todavía no veo una respuesta satisfactoria.

Parece que los desarrolladores están recurriendo a técnicas antiguas y no están usando realmente las nuevas características de "dependencias implícitas".

Agradecería ayuda con la comprensión de cómo obtener "dependencias implícitas" para trabajar con espacios de trabajo en Xcode 4.

Aquí están mis preguntas:

  • ¿Cómo se supone que las "dependencias implícitas" funcionan en Xcode 4 con espacios de trabajo?
  • ¿Por qué no se puede encontrar automáticamente el código en Libary1 y Library2 en PrimaryApp?
  • ¿Se requieren cambios adicionales para que las dependencias funcionen en un espacio de trabajo?


Esto realmente parece ser un error en el manejo de Xcode de las dependencias implícitas durante el proceso de compilación.

En un espacio de trabajo con dos proyectos, pude lograr que el Proyecto A vea las clases en el Proyecto B y compile con éxito al copiar los archivos de cabecera .h para las clases del Proyecto B en el directorio del Proyecto A. NOTA: No los agregué al Proyecto A en Xcode . Los puse en el directorio del Proyecto A en Finder.

Esta es una solución mucho más fácil que la que he visto en otros lugares, ya que no requiere cambios en los esquemas del espacio de trabajo ni en la configuración de compilación de ninguno de los proyectos. Con los archivos .h en el directorio del Proyecto A, Xcode pudo encontrar y resolver automágicamente todas las dependencias implícitas del Proyecto A en el Proyecto B.

Desafortunadamente no puede poner los archivos .h en su propio subdirectorio llamado "XcodeBugWorkaroundHeaderFiles". Deben estar en un directorio que el proyecto ya está leyendo archivos .h. Además, los alias no funcionarán, pero sí los enlaces simbólicos, por lo que al utilizar SymLinks no tendrá que preocuparse por las copias obsoletas.

Con todo esto dicho, no estoy seguro de que tener archivos .h "sigilosos" que la compilación fallará sin embargo es una buena idea. Hasta que el error se solucione en Xcode, probablemente sea mejor agregarlo al proyecto para que pueda verlo en Xcode.


Lo hice funcionar haciendo lo siguiente. 1. Agregar la Biblioteca como un segundo proyecto al espacio de trabajo. 2. Enlace binario con bibliotecas> Agregar la biblioteca estática.

- LA PARTE IMPORTANTE -

  1. Agregue lo siguiente a las "Rutas de búsqueda de encabezado" en la configuración de compilación

    $ {BUILT_PRODUCTS_DIR}

Esto vinculará los archivos de encabezado construidos al proyecto. No más errores de compilación.


Otra opción es simplemente incluir la raíz de cada "subproyecto" como una ruta de encabezado recursivo. Por ejemplo, si tiene AcmeLib, puede ir a las opciones de compilación del proyecto principal y agregar la ruta a AcmeLib a la Ruta de búsqueda del encabezado del usuario, con la opción recursiva habilitada. Luego, los archivos de encabezado de AcmeLib se buscarán automáticamente.

Para mantener la independencia de la ruta entre los desarrolladores, puede hacer que la ruta sea relativa a una variable de directorio de origen, digamos $ ACME_LIB, que cada desarrollador puede instalar en el panel "Fuentes" de las preferencias de XCode.

Entonces, para utilizar AcmeLib en un nuevo proyecto, simplemente arrastre el proyecto, agregue $ ACME_LIB a la ruta de búsqueda del encabezado y estará listo. La vinculación implícita de XCode debe conectar las dependencias.


Para resolver problemas relacionados con espacios en las rutas de búsqueda de encabezado de usuario, use

"${BUILT_PRODUCTS_DIR}"