Xcode 4 build successes, command line build fails?


Tengo un proyecto en Xcode 4 (la última versión no beta) que se construye bien cuando se construye en Xcode. Específicamente, el comando Ld utiliza correctamente el directorio de datos derivados (donde se colocan los productos de compilación, incluida una biblioteca estática dependiente).

Sin embargo, cuando compilo el mismo proyecto desde la línea de comandos, el comando Ld falla, ya que está tratando de usar la carpeta /build dentro del proyecto, que no se está llenando.

He intentado ajustar cada configuración de compilación I conocer, tanto en el proyecto padre como en el dependiente.

¿Alguna idea sobre dónde comenzar a depurar esto? Puedo proporcionar más información según sea necesario.

Editar 1: Comando completo de compilación de Xcode:

xcodebuild -project AppName.xcodeproj -target AppName -configuration "Config Name"

Donde AppName y Config Name son los valores correctos para la construcción.

Editar 2: Comandos Link (Ld).

Cuando se construye en Xcode (esto funciona):

Ld /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName normal i386
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv MACOSX_DEPLOYMENT_TARGET 10.6
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin"
/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName -F/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -filelist /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/i386/AppName.LinkFileList -mmacosx-version-min=10.6 -lxml2 -all_load -ObjC -licucore -Xlinker -objc_abi_version -Xlinker 2 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName

Cuando se compila desde la línea de comandos usando el comando build anterior (esto falla):

Ld "build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName" normal armv6
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv IPHONEOS_DEPLOYMENT_TARGET 4.0
setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/X11/bin:/opt/local/bin"
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk "-L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName "-F/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -filelist "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName.LinkFileList" -dead_strip -lxml2 -all_load -ObjC -licucore -miphoneos-version-min=4.0 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName"

Que devuelve:

ld: library not found for -lMyClientLibrary
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1
Author: James J, 0000-00-00

10 answers

Ok, así que casi 6 (facturables) horas después, he conseguido que la compilación funcione correctamente en Xcode y en la línea de comandos (y en el servidor de compilación, el punto de este ejercicio).

En el camino arreglaría un problema solo para causar otro - Aparentemente arreglaría el problema del enlazador/Ld, solo para causar problemas en la compilación ("SomeClass undeclared (first use in this function)" o "SomeHeader.h: No eran comunes tales errores de archivo o directorio).

Fue una de esas veces que Ajusté casi todos los ajustes que pude encontrar, por lo que es difícil decir qué exactamente qué mal y qué exactamente lo arregló.

Las cosas que creo que podrían han ayudado son las siguientes:

  • Compilación convertida para usar un workspace & scheme de Xcode (en lugar de project & target)
  • Se reorganizó el espacio de trabajo para tener el proyecto de la aplicación y la biblioteca estática como hermanos (no como padre/hijo)
  • Se ha cambiado la configuración de Xcode y workspace para usar las ubicaciones de compilación especificadas in targets
  • Cambie la ruta de los productos de compilación para la Aplicación y la biblioteca ../ build (ambos archivos de proyecto están contenidos en subcarpetas hermanas de un directorio maestro, por lo que haberlos construido en la misma carpeta resolvió el problema del comando linker/Ld original, creo )
  • Editó el esquema de la aplicación para compilar explícitamente el destino de la biblioteca y compilarlo antes del destino de la aplicación
  • En las Fases de compilación para el destino de la aplicación, agregue explícitamente la Biblioteca en " Vincular Binario con Bibliotecas "
  • Cambie el tipo de ubicación de la Biblioteca .una referencia de archivo a"Relative to Build Products"
  • Se agregó una fase de compilación de" Copiar encabezados " al proyecto de la Biblioteca, se agregaron los encabezados apropiados a la sección Pública
  • Cambió la ruta de la carpeta Public Headers del proyecto de Biblioteca a" / include "
  • Se cambió el directorio de instalación de la Biblioteca a $(BUILT_PRODUCTS_DIR)
  • Cambió las Rutas de Búsqueda de la Biblioteca y las Rutas de búsqueda del Encabezado del Usuario del destino de la aplicación a $(BUILT_PRODUCTS_DIR) (recursivo)
  • Se agregó un comando Limpio antes de la compilación en mi servidor de compilación de Jenkins
  • Se agregaron argumentos explícitos de SDK y Arch al comando build
  • Espacios eliminados de la configuración de compilación nombre

El comando final de compilación se ve así:

xcodebuild -workspace ClientName.xcworkspace -scheme AppName -configuration "ProdAdHoc" -sdk iphoneos -arch "armv6 armv7"

Algunos recursos útiles que utilicé al depurar esto cuestión:

De todos modos, espero haber salpicado suficientes palabras clave arriba que cualquiera que tenga problemas de construcción similares en el futuro se tropiece con esto y lo encuentre útil. No tengo idea de cómo un flujo de trabajo que hice muchas veces en Xcode 3.x se metió tan mal cuando me mudé a Xcode 4, aquí está la esperanza de Apple es capaz de limpiar esto en futuras versiones.

Esto fue un infierno de una experiencia de aprendizaje para mí, y pasar por todo esto parecía aclarar los problemas con autocompletar que estaba teniendo de antemano. Diré que las cosas podrían haber sido mucho peores; todavía podría estar desarrollando para SharePoint.

 42
Author: James J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-13 22:49:47

Me encontré con el mismo problema ayer y fue capaz de resolverlo. En un esfuerzo por reducir lo que funcionó para James, señalaré lo que tuve que hacer. Tuve que agregar un espacio de trabajo y cambiar a ejecutar xcodebuild con workspace/scheme en lugar de project / target.

El uso de workspace/scheme obligó a xcodebuild a usar la carpeta DerivedData en lugar de la carpeta de salida de compilación del proyecto principal. Esto permitió al enlazador encontrar la biblioteca estática asociada.

Esta entrada de blog fue muy útil:

Http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4 /

 10
Author: bromanko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-21 14:30:53

Obtuve este error cuando estaba experimentando con mis archivos agrego la implementación @a la .h archivo y dejó el .archivo m vacío. No creo que este sea su error, pero si alguien más lo consigue, tal vez compruebe que no ha hecho esto.

 4
Author: Popeye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-15 11:45:42

Compruebe si no importó el .m archivos en sus archivos de cabecera! Cambiante .m to .h arregló esto para mí!

 2
Author: nemesis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-25 10:47:15

No se si esto funcionará para ti pero en mi caso, tenía más de un archivo main.m. Todo lo que tenía que hacer era separar uno de los main.m del objetivo y funcionó. Asegúrate de no tener más de un main.m en tu proyecto.

 2
Author: uneakharsh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-14 13:14:11

Si nos fijamos en el registro de la compilación, pidiendo ver todos los mensajes, usted debe ver una línea concisa que dice "enlace ..."eso tiene poco en el camino de los detalles. Sin embargo, si hace clic derecho en esa línea y selecciona "expand all transcripts", obtendrá una línea muy detallada que le dirá qué comando se emitió desde XCode.

Eso debería ayudarlo a depurar el problema.

Dave

 1
Author: Dave Stampf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-12 19:33:00

Tuve una excepción similar encontrada, resulta que obtuve alguna referencia (nula) en el proyecto.pbxproj después de limpiar esas referencias nulas en el proyecto.pbxproj, la construcción de la línea de comandos fue un éxito al igual que el xcode hace anteriormente. Echa un vistazo a Xcode 4 project: utilidad para limpiar el archivo pbxproj? utility-to-clean-up-pbxproj-file

Para más referencia

 1
Author: laiBilly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:26

De repente tuve el mismo problema después de una Limpieza, al principio entré en pánico cuando vi:

linker command failed with exit code 1 (use -v to see invocation)

... pero resultó ser muy fácil de arreglar, no se necesita línea de comandos!

Hice clic en la raíz de mi proyecto (la de la parte superior con el icono de blueprint con una "A") en el Navegador, luego hice clic en la sección DEL PROYECTO (también puede hacer clic en la sección de DESTINO) y luego hice clic en el botón en la parte inferior central llamado "Validar configuración".

XCode en sí validó los archivos del proyecto y me dijo que el problema era una definición de destino duplicada, y se ofreció a solucionarlo... y voilá, el problema se ha ido!

¡Buena suerte!

 0
Author: Oscar Salguero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-18 05:22:55

Resuelvo el problema yendo a "Ruta de búsqueda de la biblioteca", y me aseguro de que todas las entradas sean correctas.

 0
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-31 16:31:52

Personalmente, tuve este problema cuando estaba desarrollando un static library. Tenía el destino static library con todo el código de producción, y un destino de prueba que extraía el archivo MyStaticLib.a como marco.

Las pruebas se ejecutaron bien en Xcode, pero no en el terminal usando xcodebuild. El problema terminó siendo que el objetivo static library estaba compilando para Standard architectures, mientras que el objetivo de prueba quería compilar para Standard architectures (including 64-bit). Cambiar el objetivo de prueba a Standard architectures solucionado todo.

 0
Author: marklar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-07 16:56:16