Pregunta

Tengo un marco personalizado que, siguiendo el consejo en la Guía de Programación marco de Apple >> Instalación del marco instalo en los marcos / Library /. Hago esto mediante la adición de una secuencia de comandos Ejecutar construir fase con la siguiente secuencia de comandos:

cp -R  build/Debug/MyFramework.framework /Library/Frameworks

En mis proyectos en los que entonces Enlace contra / Library / Frameworks / MyFramework e importación en mis clases, así:

#import <MyFramework/MyFramework.h>

Esto funciona muy bien, excepto que siempre veo el siguiente mensaje en mi consola depurador:

  

carga del programa en el depurador ...   SharedLibrary aplicar reglas de carga-todo   Advertencia: No se puede leer símbolos para "/Users/elisevanlooij/Library/Frameworks/MyFramework.framework/Versions/A/MyFramework" (archivo no encontrado).   Advertencia: No se puede leer símbolos de "MyFramework" (todavía no asignada en la memoria).   Programa cargado.

Al parecer, el compilador busca primero en / Usuarios / elisevanlooij / Library / Frameworks, no puede encontrar MyFramework, luego mira en / Library / Frameworks, no encontrará MyFramework y sigue su camino feliz. Hasta ahora esto ha sido más una molestia que un problema real, pero cuando runnning pruebas unitarias, GDB se detiene en el (archivo no encontrado) y se niega a continuar. He resuelto el problema mediante la adición de una línea adicional a la fase de ejecución de secuencias de comandos

cp -R  build/Debug/MyFramework.framework ~/Library/Frameworks

pero se siente como sello con una cinta adhesiva algo que no debe romperse en el primer lugar. ¿Cómo puedo solucionar este problema?

¿Fue útil?

Solución

En los últimos meses, he aprendido mucho más acerca de los marcos, así que estoy reescribiendo esta respuesta. Tenga en cuenta que estoy hablando de la instalación de un marco como parte del flujo de trabajo de desarrollo .

La ubicación preferida para la instalación de un marco público (es decir, un marco que será utilizado por más de una de sus aplicaciones o paquetes) es / Library / Frameworks [texto del enlace] porque "marcos en esta ubicación se detectan automáticamente por el compilador en tiempo de compilación y el enlazador dinámico en tiempo de ejecución. "[Guía Marco de programación]. La forma más elegante de hacer esto se encuentra en la sección Distribución de los valores de creación.

A medida que trabaja en su marco, hay momentos en los que desea actualizar el marco cuando se hace una compilación, y momentos en los que no lo hacen. Por esa razón, puedo cambiar la configuración de implementación sólo en la configuración de liberación. Por lo tanto:

  1. Haga doble clic en el objetivo marco para que aparezca la ventana de información de destino y cambiar a la pestaña Generar.
  2. Seleccione Desc en la caja de selección de configuración.
  3. baje hasta la sección Distribución e introduzca los siguientes valores:
  

Ubicación de despliegue = Sí (haga clic en la casilla de verificación)

     

Instalación construir productos Localización = /

     

Directorio de instalación = / Library / Frameworks

La instalación construir productos Localización sirve como la raíz de la instalación. Su valor por defecto es algún directorio / tmp:. Si no lo cambia a la raíz del sistema, que nunca ve su marco instalado ya que es escondido en el directorio / tmp

Ahora se puede trabajar en su marco como desee en la configuración de depuración sin alterar sus otros proyectos y cuando esté listo para publicar todo lo que hay que hacer es cambiar a liberar y hacer una generación.

Xcode 4 Advertencia Desde el cambio a Xcode 4, he experimentado una serie de problemas con mi marco personalizado. En su mayoría, están ligando advertencias en el BGF que en realidad no interfieren con la utilidad del marco, excepto cuando se ejecuta la unidad de prueba incorporado. He presentado una solicitud de asistencia técnica a Apple hace una semana, y todavía está buscando en ella. Cuando llego a una solución de trabajo voy a actualizar esta respuesta ya que la cuestión ha demostrado ser muy populares (1 kViews y contando).

Otros consejos

No hay mucha razón para poner un marco en Library / Frameworks, y es un montón de trabajo: Usted necesitaría o bien lo hacen por el usuario en un paquete de instalación, que es una tremenda molestia de crear y mantener, o tienen código de instalación en su aplicación (que sólo podría instalar a ~ / L / M, a menos que gastar el tiempo y el esfuerzo necesario para que su aplicación capaz de instalar a / L / M con poderes de raíz).

Mucho más común es lo que Apple llama un ‘marco privado’ . Podrás agrupar esto en su paquete de aplicaciones.

Incluso los marcos destinados para uso general por cualquier aplicación (por ejemplo, la chispa, Growl) son, en la práctica, construido para ser utilizados como marcos privados, simplemente porque la forma “correcta” de la instalación de una sola copia del marco de Biblioteca / marcos es una molestia.

La forma convencional de hacer esto es que su proyecto de marco y de sus clientes compartir un directorio de construcción común. Xcode buscará cabeceras marco y de enlace contra binarios marco de la carpeta de la creación primero , antes que cualquier otra ubicación. Así que un proyecto de aplicación que recopila y enlaces contra la cabecera recogerá el más recientemente-construyó uno, en lugar de que sea instalado.

A continuación, puede quitar el cp -r y en lugar de utilizar el lugar de instalación de la estructura Ajuste para colocar su producto de construcción en el emplazamiento definitivo, utilizando xcodebuild instalar DSTROOT = / en la línea de comandos. Pero lo único que necesita hacer esto cuando haya terminado, no cada vez que la reconstrucción de la estructura.

Por supuesto, cuando distribuya su marco se debe instalar en / Library / Frameworks; sin embargo, parece extraño para mí que usted está haciendo eso con las versiones de prueba / depuración de su marco.

Mi primer instinto sería instalar versiones de prueba bajo ~ / Library, ya que sólo hace que la configuración de la prueba y depuración del entorno que mucho más simple. Si es posible, yo esperaría que el marco de depuración / prueba que se encuentra en el árbol de construcción de la versión que estoy probando, en cuyo caso se instala como un marco privado con fines de prueba. Eso haría que su vida mucho más simple cuando se trata de tiempo para ocuparse de múltiples versiones de su marco.

En última instancia, no importa donde se encuentra el marco siempre y cuando su aplicación o conjunto de pruebas de carga la versión correcta. Elija la ubicación que hace que las pruebas / depuración / desarrollo más fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top