ios - Bibliotecas estáticas en Xcode 4
xcode4 static-libraries (6)
Eche un vistazo a mi nota de solución y a la entrada Open Radar .
El nodo de producto de color rojo es un error de Xcode. Puede hacerlo funcionar cambiando SDKROOT
en la configuración de compilación del Proyecto . La configuración de compilación de destino no funcionará para la visualización y soporte de IDE.
Editar
Para referencia posterior.
Actualmente, mi opinión ha cambiado porque el proyecto Xcode no es completamente capaz de tratar con múltiples plataformas. Aunque puede mostrar varias plataformas, solo se puede elegir una plataforma al mismo tiempo para que se muestre en pantalla mediante la configuración de SDKROOT
. Si selecciona iOS , utilizará algo como Debug-iphoneos
para crear la ruta del producto. Por lo tanto, faltarán todos los objetivos de Mac OS X. Si eliges Mac OS X , usará algo como Debug
. Por lo tanto, faltarán todos los productos de los objetivos de iOS.
Creo que Xcode todavía tiene errores internos relacionados con esto. Ya es hora de hacer que Xcode se estabilice.
(Mi pregunta ha sido formulada aquí anteriormente, pero no puedo encontrar respuestas que funcionen. Por ejemplo, Xcode4 Workspace con el proyecto de biblioteca estática y proyecto de aplicación )
Estoy tratando de usar una biblioteca proporcionada por un tercero. Proporcionan el proyecto XCode que crea un archivo libLibraryName.a . Recomiendan agregar el proyecto como un subproyecto al mío, y luego agregar el archivo libLibraryName.a del producto al conjunto de bibliotecas descrito en la configuración de mi proyecto "Enlace binario con bibliotecas".
La biblioteca se compila correctamente: se genera el archivo .a. Pero el proyecto muestra un archivo libLibraryName.a rojo en el grupo Productos. No puedo hacer que se vuelva negro. Y el proyecto principal dice que no puede encontrar LibraryName para vincular.
Como prueba, creé un nuevo proyecto de biblioteca estática utilizando la plantilla de biblioteca estática XCode 4. Este proyecto muestra el mismo comportamiento: el producto nunca aparece ''negro'' a pesar de que el archivo .a está creado. ( Editar: se vuelve negro si construyes para el dispositivo, no para el simulador).
Sé que XCode 4 coloca archivos intermedios y de producto en una ubicación compartida de forma predeterminada. Intenté esta configuración y modifiqué la configuración para colocar los archivos del producto en las carpetas descritas en la configuración de compilación. Ninguna de las configuraciones funciona.
La gente también sugirió crear un dispositivo en lugar de un simulador. Intenté esto en vano.
¿Lo que da? ¿Cómo puedo obtener un proyecto de biblioteca estática para reconocer dónde se construyó el producto y, posteriormente, hacer referencia a este producto en otro proyecto?
Estaba teniendo este problema con una de mis bibliotecas. De hecho, tengo otras 4 bibliotecas que construyo que están incluidas que se ven bien, aparecen en negro, pero que no. Mi biblioteca roja se resolvió cambiando el SDK base en la configuración de compilación del proyecto de la biblioteca. Como la biblioteca podría compilarse para Mac OS X e iOS, se configuró para la configuración de Mac OS X. La biblioteca de destino de iOS aún se creó pero nunca se volvió negra. Una vez que cambié la configuración de compilación del SDK base para ser la última versión de iOS, mi biblioteca se volvió negra.
Mira mi respuesta aquí y mira si te ayuda:
Vinculación de una biblioteca estática a un proyecto de iOS en XCode 4
Estos se basan en mis instrucciones para mi propia biblioteca. Creo que el paso que falta en el proceso original es que no agrega la biblioteca estática a su proyecto de aplicación como una dependencia de destino (paso 3 en mis instrucciones) al mismo tiempo que lo vincula en "Enlace binario con bibliotecas". También podría necesitar hacer el paso # 5 dependiendo de cómo los encabezados están vinculados por el proyecto de biblioteca estática.
Cuando realizo este proceso con mis propias aplicaciones que tienen referencias de proyectos cruzados a proyectos de bibliotecas estáticas, en realidad tiene un paso menos que el proceso equivalente en Xcode 3.
Muchos saltos de aro, pero aquí están mis notas ahora que lo tengo funcionando.
Si crea un nuevo proyecto XCode4 iOS "Cocoa Touch Static Library" (y le agrega un código), el proyecto se compilará perfectamente. Pero el archivo de producto libLibraryName.a solo se vuelve negro (del rojo, lo que significa que el archivo no existe) cuando se crea un dispositivo. Una compilación de simulador no muestra que el objetivo se construyó cuando en realidad lo era.
En la configuración de compilación de destino del proyecto, la "Ruta de productos de compilación por configuración" tiene como valor predeterminado
$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
Si cambia esto a otra cosa (o si actualizó el proyecto de XCode3.x que usó$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)$(IPHONEOS_DEPLOYMENT_TARGET)
como valor predeterminado, creo), entonces el archivo de producto libLibraryName.a nunca se volverá negro. Para mí, esto dice que hay un error en XCode en alguna parte.Puedo vivir sin que el archivo del producto se ponga negro después de una compilación (es un buen indicador, pero bueno, lo que sea). Pero sí necesito mi proyecto consumidor para poder encontrar la compilación correcta de la biblioteca, ya sea para simulador o dispositivo . En un mundo ideal, habría un solo archivo .a con i386 / arm6 / arm7 bits en él, pero de nuevo, este no es mi proyecto de biblioteca / biblioteca.
La guía de transición XCode4 es lo que me mostró la luz. Prescribe la creación de un espacio de trabajo que hospede ambos proyectos, y ambos se compilarán en el mismo directorio de compilación compartido. No estaba usando un espacio de trabajo previamente, así que usé el comando Archivo / Guardar como espacio de trabajo para crear el nuevo archivo de espacio de trabajo. Luego, agregué el proyecto de la biblioteca, teniendo cuidado de asegurar que se colocara como un par para mi proyecto principal y no como un niño.
Tenía que asegurarme de que el espacio de trabajo estuviera configurado para ubicar el resultado de compilación en una carpeta común. En el cuadro de diálogo Configuración del espacio de trabajo, establezca la configuración de Ubicación de la compilación en "Colocar productos de compilación en la ubicación de datos derivados".
También tuve que asegurarme de marcar la casilla de verificación "compartida" para cada proyecto en el cuadro de diálogo Gestionar esquemas.
Finalmente, para especificar la dependencia de la biblioteca para mi proyecto principal, simplemente fui a la pestaña de Crear Fases de Construcción, Binarios de Enlace con Bibliotecas, hice clic en ''+'' y luego seleccioné el archivo libLibraryName.a debajo de la carpeta de Espacio de Trabajo. Tenga en cuenta que había intentado esto antes cuando no había espacio de trabajo y ningún directorio de compilación común, y el resultado fue que XCode no pudo encontrar el archivo .a durante el enlace.
Todo dicho y hecho, funciona como un encanto. No puedo evitar pensar que debería ser mucho más fácil, ya que creo que fue en XCode3.
Me encantaría leer acerca de la experiencia de cualquier otra persona con todo esto, o cualquier comentario sobre otras formas (más simples) de hacer que las libs estáticas de enlace funcionen bien.
Tuve el mismo problema con mi equipo. Uno de los desarrolladores estaba sufriendo con este problema, sin embargo, mi xcode pudo compilar y encontró el encabezado correctamente. Por cierto: todas las "configuraciones de compilación" se configuraron correctamente (siempre busca rutas de usuario, rutas de encabezado de usuario, etc.).
Me di cuenta de que su proyecto estaba en un directorio con espacios en su camino (../my project / blah.xcodeproj). Al cambiar eso, Xcode pudo encontrar los encabezados de la biblioteca estática dentro del mismo espacio de trabajo.
Solo tenga en cuenta los nombres de los directorios. Mis dos centavos
Un detalle aclaratorio (después de excavar a través del resultado de compilación hasta que comencé a tener los ojos cruzados): si encuentra que los encabezados de su biblioteca se exportan a Build/Products/Debug
y su proyecto principal está buscando en Build/Products/Debug-iphonesimulator
, su biblioteca está siendo desarrollada para OS X, no para iOS. Puede cambiar esto en la configuración "Plataformas compatibles" en la sección "Arquitecturas" de la configuración del proyecto. OS X parece ser la configuración predeterminada si crea un proyecto lib de estática estática de C ++, por lo que esta situación es bastante fácil de encontrar.