cocoa - Xcode 4 y proyectos anidados: archivos de encabezado no encontrados
frameworks xcode4 (8)
(A partir de Xcode 5.1)
Cuando el subproyecto está construido por XCode, los archivos de encabezado del subproyecto se copian en el directorio de compilación. Al archivar, parece que este directorio de destino de copia no se agrega a la ruta de búsqueda del encabezado / incluir. Deberá ir a la Configuración de compilación y agregar
$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include
a las "Rutas de búsqueda de encabezado" para el esquema que usa para archivar.
Si no está seguro de qué esquema se utiliza para archivar, vaya a Producto -> Esquema -> Editar esquemas y busque Archivo en la columna de la izquierda.
Tengo una miríada de problemas con Xcode 4 y proyectos anidados que funcionaron muy bien bajo Xcode 3.2. Aquí hay uno muy básico que no puedo resolver:
Estoy construyendo un marco de cacao que requiere otro marco de cacao para el que tengo la fuente. Entonces realizo los pasos habituales:
- Arrastre el archivo
.xcodeproj
del marco requerido en mi proyecto de marco principal - En mi marco principal bajo TARGETS> MyFramework> Build Phases> Target Dependencies : agregue el objetivo del proyecto anidado
- Asegúrese de que los archivos de encabezado del marco anidado sean públicos
- En Xcode Settings> Locations> Build Location lo tengo configurado para colocar productos de construcción en la ubicación de datos derivados (recomendado)
- La ruta de compilación de productos de ambos objetivos está configurada en
${BUILT_PRODUCTS_DIR}
y me dicen que están en la ubicación DerivedData / Debug (o Release) - La configuración de arquitectura para ambos objetivos es idéntica
Luego pulso [CMD] + B para compilar y me dice que no encuentra los archivos de encabezado del marco anidado. Cuando compruebo la configuración, las Rutas de búsqueda del encabezado del usuario contienen la ruta a DerivedData / Debug , y dentro está el destino del marco anidado con los archivos del encabezado en Versions / A / Headers .
Estoy sentado aquí, ¿alguien tiene una idea de lo que estoy haciendo mal?
El problema desaparece al crear Debug cuando cambio las rutas de búsqueda del encabezado del usuario a ${BUILT_PRODUCTS_DIR}/MyFramework.framework/Headers
. Sin embargo, esto no funciona cuando se construye para Distribución, ya que los marcos luego usan su configuración de Liberación, que termina en un subdirectorio diferente ...
Mi solución temporal es definir también una configuración de Distribución para los proyectos anidados. De esta forma, se encuentran los encabezados y el enlazador puede vincularse con éxito.
Aquí está mi conocimiento sintetizado hasta ahora:
Olvídate de toda la cabecera pública con Xcode, es un PITA y no funciona correctamente al archivar tu aplicación. En su lugar, tenga todos los archivos de encabezado de la biblioteca estática en el nivel del proyecto y dígale a su aplicación dónde encontrarlo.
Alivie su dolor asegurándose de que todos los objetivos tengan el mismo nombre para la configuración de compilación (es decir, agreguen una configuración "AdHoc" e "Implementación" a las bibliotecas estáticas).
En las configuraciones de compilación, señale las rutas de búsqueda de encabezado (si usa
#include <file.h>
) o las rutas de búsqueda de encabezado de usuario (si usa#include "file.h"
) al directorio del proyecto de biblioteca estática. Si el proyecto de la biblioteca estática está dentro del directorio de la aplicación , use esto:"$(PROJECT_DIR)"
( recursivo habilitado)Si tiene un directorio que contiene a) el proyecto de biblioteca estática yb) su aplicación, entonces esto debería funcionar:
"$(PROJECT_DIR)/.."
( recursivo habilitado)Si el submódulo contiene librerías compiladas, configure las Rutas de Búsqueda de la Biblioteca a:
"$(TARGET_BUILD_DIR)"
Asegúrese de que todos los proyectos de bibliotecas estáticas que utilice tengan Omitir instalación establecida en
YES
.De nuevo, no hay archivos de encabezado públicos (Fases de compilación »Encabezados de copia) en ninguna de las bibliotecas estáticas, de lo contrario, Xcode no podrá archivar una aplicación.
Asegúrese de decirle a Xcode cuándo crear las bibliotecas estáticas, como se muestra en este Tech Doc de Apple .
Vieja respuesta:
Todavía no he encontrado una solución real a este problema con las bibliotecas estáticas. Lo que funciona para mí es:
- Crear una configuración "AdHoc" para la biblioteca estática
- Agregue
$(BUILT_PRODUCTS_DIR)
a las rutas de búsqueda de encabezado de usuario para la aplicación (con recursivo marcado) -> esto se usa al ejecutar la aplicación - En el menú de Xcode, seleccione Producto > Crear para > Crear para archivar
Esto funciona, la aplicación encuentra los archivos de cabecera y se construye a sí misma, termina en DerivedData // Build / Products / AdHoc-iphoneos / como un paquete de aplicaciones. Siguiendo estas sencillas instrucciones (vínculo inactivo) de TestFlightApp.com, puedo empaquetar esta aplicación en una IPA y enviarla. Simplemente seleccionando Archivar la aplicación desde Xcode nuevamente no se encuentran los encabezados, incluso si realmente están en el directorio de compilación de AdHoc-iphoneos.
Asegúrese de que su marco de terceros se agregue como «grupo» a su proyecto principal, para que pueda verlo en la jerarquía de su proyecto ...
Estaba teniendo el mismo problema con una configuración llamada "Ad Hoc" (según la recomendación de TestFlight en http://help.testflightapp.com/customer/portal/articles/402782-how-to-create-an-ipa-xcode-4 ) y el proyecto principal no pudo encontrar algunos de los encabezados de los proyectos anidados. Cambié el nombre del proyecto a "AdHoc" (sin espacios) y el problema desapareció; Parece que los espacios pueden arruinar las rutas de búsqueda de encabezados en algunos casos, aunque no he descubierto los detalles de cuándo podría suceder eso y por qué.
Estaba teniendo este problema con un proyecto anidado que construyó una biblioteca estática. Encontré este documento en el sitio de las manzanas que me salvó completamente la vida.
Estoy tan contento de no tener que perder el tiempo con las rutas de datos derivadas.
Para mí, esto ocurrió después de una fusión GIT, que creó muchos conflictos, uno de ellos relacionado con el archivo del proyecto. Después de la fusión, estoy seguro de que la estructura del archivo de proyecto cambió.
Lo que terminé haciendo fue ingresar al proyecto "Configuración de compilación", luego buscar "Buscar siempre rutas de usuario" y convertirlo en Yes
.
Supongo que la fusión convirtió este booleano en No
, por lo tanto, el proyecto no estaba buscando los archivos de cabecera en los lugares correctos.
Tuve el mismo problema aquí y pude resolver el problema configurando "Crear ubicación" para colocar los productos de compilación en las ubicaciones especificadas por los objetivos "
Tuve este problema: podría compilar configuraciones de Debug y App Store, pero no Ad Hoc. Building Ad Hoc me dio errores porque no pudo encontrar los archivos .h necesarios para los proyectos anidados.
Resultó que tenía un aprovisionamiento expirado persistente en mi configuración de versión. Actualicé ese enlace de aprovisionamiento y ahora puedo crear Ad Hoc y usar la función Archivar para empaquetarlo .
Me tomó horas descubrirlo! Mi mente simplemente no pasó de faltar archivos .h a errores de aprovisionamiento por sí mismo. =) Pudo haber un error o advertencia quejándose sobre el aprovisionamiento faltante, pero si fue así, quedó enterrado entre los cientos de errores relacionados.