2011-06-09 11 views
9

¿Existe una mejor práctica para importar encabezados de biblioteca estática en Xcode 4? La mayoría de mis proyectos dependen de varios otros proyectos, por lo que recientemente comencé a usar la función de espacio de trabajo para construir todos los módulos necesarios desde un solo lugar (lo que considero muy conveniente).Administración de encabezado con bibliotecas estáticas en Xcode 4

Lo que apesta es que no podemos usar marcos personalizados en iOS, por lo que las dependencias deben construirse como bibliotecas estáticas y tengo problemas con las rutas de búsqueda de encabezado. Mientras que los marcos mantienen sus encabezados dentro del paquete del marco, las bibliotecas estáticas no tienen la opción. Odio configurar las rutas de búsqueda de encabezado de usuario individualmente para cada biblioteca que importo. Idealmente, me gustaría arrastrar el proyecto de dependencia al espacio de trabajo, agregar la biblioteca al objetivo principal y construir, sin más configuraciones. ¿Este flujo de trabajo es compatible?

Respuesta

5

La mejor solución que tengo actualmente es mantener todas las bibliotecas compatibles en una carpeta común (digamos Support), estableciendo la ruta de búsqueda del encabezado en Support/**. Se siente torpe, pero funciona.

+0

He estado tratando de encontrar una solución elegante para esto durante días. La tuya es la mejor que he encontrado hasta ahora. – Bastek

+1

@zoul ¿podría expandirse? los tutoriales que he visto no llegan a explicar el proceso. Lo que he hecho es 1) crear un toque táctil de cacao estático, 2) arrastrar y soltar el archivo xcodeproj a un grupo de 'Dependencias' en el proyecto de cliente, 3) agregarlo a Dependencias de destino y Binario de enlace, y 4) intentar establecer las rutas de búsqueda del encabezado ... y no hay forma de que este último paso funcione :( – entonio

+0

@entonio, [aquí hay un buen tutorial] (http://blog.carbonfive.com/2011/04/04/using- open-source-static-libraries-in-xcode-4/# adding_the_static_librarys_headers) que puede que aún no hayas leído. También cubre la configuración de las rutas de los encabezados, es de esperar que esté actualizado después de los dos años desde que se publicó. – zoul

1

Me di cuenta de que puedo configurar los encabezados de la biblioteca estática para que se copien en la carpeta Headers (en lugar de la predeterminada /usr/local/include). Esta carpeta aparecerá en la carpeta de productos de construcción y puedo establecer Rutas de búsqueda de encabezado de usuario en $(BUILT_PRODUCTS_DIR) y recursivo.

Si todas las bibliotecas están configuradas para copiar sus encabezados públicos en esta carpeta, obtengo el comportamiento deseado: al agregar una nueva dependencia, simplemente arrastro el proyecto al área de trabajo, establezco la dependencia de vinculación y estoy bien ir.

+1

Desafortunadamente, esto no funciona de manera confiable con Xcode actual, la compilación de archivos falla por alguna razón. Me gustaría recibir una mejor solución. – zoul

3

Lo que hago es bastante complicado, pero funciona bien para mí.

En la configuración del proyecto de biblioteca estática, en la sección "Empaquetado", configuro la "Extensión de Wrapper" en "marco". Entonces cambio:

"Public Headers Folder Path" to "$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/Headers" 

y

"Private Headers Folder Path" to $(PRODUCT_NAME).$(WRAPPER_EXTENSION)/PrivateHeaders 

El resultado final de los productos de construcción es una carpeta llamada "MyLibraryName.framework" las agallas de los cuales se parecen a ... bueno .. un Marco . Una cosa que me gusta de esto es que puedo usar Marco de estilo incluye en mi código:

#include <MyLibraryName/blah.h> 

La desventaja es que (como se descubrió en la respuesta de "Zoul") el comando "Archivo" no funciona correctamente . La razón por la que no funciona es porque el comando Archive separa los productos finales de compilación y los productos de compilación de destino en directorios separados. Una "compilación" normal no hace eso. Cuando archiva, el sistema intenta encontrar los encabezados de las bibliotecas estáticas en el directorio final de productos de compilación y no puede encontrarlos porque el sistema los colocó en el directorio de compilación de destino para la biblioteca estática.

Si lo piensas, Xcode piensa que el objetivo de tu biblioteca estática tiene un solo "producto". Ese producto es "libMyLibraryName.a". Pero realmente el objetivo tiene dos productos ... uno es la biblioteca, y el otro es el conjunto de encabezados para la biblioteca. El problema con el comando Archivar es que la biblioteca se copia como un producto de compilación, pero los encabezados no lo son. Usted termina con el "encabezado no se pudo encontrar" cuando intenta ejecutar el archivo.

Para corregir ESO, lo que hago es utilizar una fase de compilación Ejecutar script.La secuencia de comandos se parece a esto (escrito en Ruby):

if ENV["TARGET_BUILD_DIR"] != ENV["BUILT_PRODUCTS_DIR"] then 
    $product_name = ENV['PRODUCT_NAME'] 
    $wrapper_extension = ENV['WRAPPER_EXTENSION'] 
    $target_build_dir = ENV['TARGET_BUILD_DIR'] 
    $built_products_dir = ENV['BUILT_PRODUCTS_DIR'] 

    $source_file = File.join($target_build_dir, $product_name + "." + $wrapper_extension) 
    $dest_file = File.join($built_products_dir, $product_name + "." + $wrapper_extension) 

    system "ln -s #{$source_file} #{$dest_file}" if File.exist?($source_file) 
end 

lo tanto, si el directorio de construcción de destino y el directorio de productos construidos no coinciden ... crear un enlace simbólico al "marco" falso que he creado en los productos construidos dir.

Como dije, este es un esquema complejo, pero funciona y me permite usar el estilo de framework que me gusta. Todo el lío se simplificaría mucho si Xcode permitiera a los desarrolladores de iOS crear Frameworks (lo que también significaría que iOS permitiría a los desarrolladores crear bibliotecas dinámicas, algo que Apple es reacio a hacer) o si Apple crearía una variante de marcos ... un paquete que contiene una biblioteca estática y los encabezados que la acompañan (¿static_framework?) para que tenga un producto de compilación que contenga tanto los encabezados como la biblioteca estática.

Cuestiones relacionadas