xcode4 build linker static-libraries

xcode4 - La configuración de compilación personalizada de Xcode causa "biblioteca/archivo no encontrado" para las bibliotecas estáticas



build linker (7)

Aquí hay algo que funciona para mí.

En el proyecto con la configuración de compilación Adhoc, anule la "Ruta de productos de compilación por configuración" (CONFIGURATION_BUILD_DIR) y "Ruta de archivos de compilación intermedia por configuración" (CONFIGURATION_TEMP_DIR) para que la configuración de compilación Adhoc use la misma carpeta que la configuración de lanzamiento.

Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME) Adhoc: CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

Ahora cuando haces una compilación Adhoc, Xcode colocará libFoo.a y Bar.app en la carpeta Release-iphoneos. El enlazador estará contento y puede usar -force_load $ (BUILT_PRODUCTS_DIR) /libFoo.a como de costumbre.

Alternativamente, puede agregar la carpeta Release-iphoneos a las rutas de búsqueda de la biblioteca para la configuración de compilación de Adhoc:

Adhoc: LIBRARY_SEARCH_PATHS = $(inherited) $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

Pero luego tendrá que establecer una carga -force diferente para cada configuración de compilación:

Debug: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a Adhoc: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME) Release: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a

Tengo un espacio de trabajo con un proyecto que enlaza con las bibliotecas estáticas en otro proyecto (que también está en el área de trabajo). Es un problema en Kobold2D que no he podido resolver, aunque entiendo la causa, y supongo que es similar a esta pregunta .

Los objetivos del proyecto y los objetivos de la biblioteca estática tienen las configuraciones de compilación Depurar y Versión . Todo está bien.

Ahora alguien agrega una nueva configuración de compilación en el proyecto y la nombra Ad-Hoc, por ejemplo. Ahora el objetivo del proyecto crea la configuración Ad-Hoc , sin embargo, las bibliotecas estáticas no tienen esa configuración. Aparentemente, luego de forma predeterminada crean la configuración de Release .

Al final, cuando se supone que el enlazador reúne todo, falla:

ld: library not found for -lbox2d-ios Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++ failed with exit code 1

Para las bibliotecas cargadas a la fuerza a través de -force_load $(BUILT_PRODUCTS_DIR)/libSomeLib.a el error es similar pero dice "archivo no encontrado". Debo señalar que la biblioteca "libbox2d-ios.a" se encuentra en la lista de fase de compilación "binario de enlace con bibliotecas".

Obviamente, el problema es que el vinculador supone que las bibliotecas están en la carpeta Ad-Hoc-iphoneos en BUILT_PRODUCTS_DIR, mientras que en realidad están en la carpeta Release-iphoneos porque no tienen configuración de compilación Ad-Hoc .

¿Cómo puedo darle una bofetada al engarce en la cara y decirle que busque las bibliotecas donde están? Preferiblemente, estoy buscando una solución que funcione para ambos casos, es decir, las bibliotecas se agregan de la manera estándar (enlace binario con la fase de compilación de bibliotecas) y las bibliotecas que necesitan una carga -force adicional para funcionar.

Espero que haya alguna forma de:

  • obligar a las bibliotecas a colocarse en la carpeta de configuración de compilación del objetivo de la aplicación
  • ejecutar una secuencia de comandos posterior a la compilación y pre-enlace que copia cada biblioteca a la carpeta de configuración de compilación
  • especificar una ruta relativa a las bibliotecas
  • usa una macro diferente a $ BUILT_PRODUCTS_DIR para -force_load
  • una bandera de enlazador como -WTFhacer todos los problemas-irse

Disculpe, pero tengo que decir esto ... ¡ARGH! :)



Mi framework está construido usando otro proyecto de SDK dentro de mi proyecto de aplicación. Primero tengo un "Debug" y "Release", luego agrego una nueva configuración de "TestFlight" . No puedo archivar con esa nueva. Terminé agregando una nueva configuración de compilación con el mismo nombre en el proyecto SDK . En otras palabras, terminé agregando la configuración de "TestFlight" a AMBOS proyectos de mi aplicación y SDK. Ahora el archivo funciona.

No estoy seguro de si es la mejor manera de hacerlo. Pero se ve lo suficientemente limpio para mí por ahora. :)

Ah, y para Cocoapods , después de duplicar la configuración, si ejecuta la pod install inmediato obtendrá esta advertencia amarilla:

[!] CocoaPods no configuró la configuración base de su proyecto porque su proyecto ya tiene un conjunto de configuraciones personalizadas. Para que la integración de CocoaPods funcione, configure las configuraciones base del objetivo ...

Tienes que ir al Proyecto, a la pestaña "Información", a la sección "Configuraciones", a seleccionar la nueva configuración que acabas de crear y a "Poner.release" de todos los objetivos en "Ninguno" primero. Después de eso, puede ejecutar la pod install forma segura.


No he encontrado una manera de hacer esto, desafortunadamente. La mejor solución que puedo encontrar es agregar nuevos objetivos en lugar de nuevas configuraciones de compilación. Así que, por ejemplo, en uno de mis proyectos solo tengo configuraciones de liberación y depuración, pero tengo objetivos adicionales denominados "MyProject - app store" y "MyProject - ad hoc". Esto solo será posible si tienes el control del archivo del proyecto, por supuesto.

Tener metas duplicadas sentadas es extremadamente molesto porque puedes agregar archivos a un objetivo y olvidarte de agregarlos a los demás, y no lo sabrás hasta que intentes construirlo. Pero construye, que es una victoria (con xcode de todos modos).

Una pregunta similar que hice hace un tiempo: ¿Cuál es la forma correcta de establecer configuraciones de compilación en un proyecto ios utilizando bibliotecas estáticas para crear un archivo en xcode 4?


Por lo general, tengo un esquema AppStore (asignado a la configuración de mi AppStore ).

Una cosa que me sucedió a mí fue este problema que hizo que Cocoapods generara una carpeta de Pods.build para Pods.build dentro de Release-iphonesimulator (como alternativa) en lugar de AppStore-iphonesimulator .

Supongo que omití un clic cuando conecté el esquema y la configuración y solo eliminarlo y volver a agregar me hizo comprender qué fue lo que salió mal. Verifica la diferencia

Estaba usando cocoapods 0.38.2 , así que esta fue claramente una configuración errónea del usuario y no un problema de Cocoapods que se resolvió en 0.34


Puede agregar CONFIGURATION_BUILD_DIR = / Some / Shared / Dir antes de ejecutar xcodebuild. Por ejemplo:

cd SOURCE_DIR xcodebuild -workspace YourProject.xcworkspace -scheme YourScheme -configuration AdHoc -sdk iphoneos clean build CONFIGURATION_BUILD_DIR="`pwd`"/build


Tengo un problema similar al utilizar CocoaPods e intentar tener más de una configuración Adhoc (o Enterprise, o Beta).

Esto es lo que parece funcionar (digamos que ambos proyectos se encuentran en el mismo espacio de trabajo xc):

  • Agregue la lib generada del subproject al binario de enlace del proyecto principal con bibliotecas.

  • Como la configuración Adhoc no es conocida por el subproject , Xcode usará la configuración de Release como una alternativa (o quizás la primera configuración de la lista) cuando la construya.

  • El enlazador se quejará porque no puede encontrar la lib ... ok, manejemos esta.

  • Agregue una fase de compilación Ejecutar script al mainproject , justo después de la fase Dependencias de destino. Ingrese este script:

if [ "$CONFIGURATION" = "Adhoc" ]; then echo "=====================================" echo "Copying libPods Release into the Adhoc product build dir!" echo "=====================================" cp "$BUILT_PRODUCTS_DIR/../Release-$PLATFORM_NAME/libPods.a" "$BUILT_PRODUCTS_DIR" else echo "No manual lib copy." fi

Esto copiará la lib generada por la creación de Release del subproject (que ocurrirá cuando se construya el proyecto mainproject ) en el directorio de compilación de Adhoc , de modo que el enlazador encuentre la lib. ¡Y deberíamos estar listos para ir! ¡Sí!