cordova build ios
¿La construcción de Xcode 4 tiene éxito, falla la compilación de la línea de comando? (10)
¡Compruebe si no importó los archivos .m en sus archivos de encabezado! ¡Cambiar .m a .h me solucionó esto!
Tengo un proyecto en Xcode 4 (la última versión no beta) que funciona bien cuando está construido en Xcode. Específicamente, el comando Ld usa correctamente el directorio de datos derivados (donde se ubican los productos de compilación, incluida una biblioteca estática dependiente).
Sin embargo, cuando construyo el mismo proyecto desde la línea de comando, el comando Ld falla, ya que está tratando de usar la carpeta / build dentro del proyecto, que no se está rellenando.
Intenté ajustar cada configuración de compilación que conozco, tanto en el proyecto principal 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 compilación.
Editar 2: comandos de enlace (Ld).
Cuando está construido 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 construye desde la línea de comando usando el comando de compilación 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
Ayer corrí al mismo problema y pude resolverlo. En un esfuerzo por reducir lo que funcionó para James, señalaré lo que tenía 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 forzó a xcodebuild a usar la carpeta DerivedData en lugar de la carpeta de salida de compilación dentro del proyecto principal. Esto permitió al vinculador encontrar la biblioteca estática asociada.
Esta publicación del blog fue de gran ayuda:
http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4/
De repente, tuve el mismo problema después de un Clean, al principio entré en pánico cuando miré:
linker command failed with exit code 1 (use -v to see invocation)
... pero resultó ser realmente fácil de arreglar, ¡no se necesita una línea de comando!
Hice clic en la raíz de mi proyecto (la que está en la parte superior con el ícono del plan con una "A") en el Navegador, luego hice clic en la sección PROYECTO (puede hacer clic en la sección OBJETIVO también) y luego presioné el botón en la parte inferior -middle llamado "Validar configuración".
XCode validó los archivos del proyecto y me dijo que el problema era una definición de objetivo duplicada, y se ofreció a arreglarlo ... y voilá, ¡el problema se ha ido!
¡Buena suerte!
No sé si esto funcionará para usted, pero en mi caso, tenía más de un archivo main.m
Todo lo que tuve que hacer fue separar uno de los main.m
del objetivo y funcionó. Asegúrese de no tener más de un main.m
en su proyecto.
Obtuve este error cuando estaba experimentando con mis archivos. Agregué la @implementation al archivo .h 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.
Ok, casi 6 horas (facturable) después, obtuve que la construcción funcione correctamente en Xcode y en la línea de comandos (y en el servidor de compilación, el objetivo 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 (primer uso en esta función)" o "SomeHeader.h: No such such file o el directorio "los errores eran comunes".
Fue en una de esas ocasiones que ajusté casi todos los ajustes que pude encontrar, por lo que es difícil decir qué es exactamente lo que está mal y qué lo solucionó exactamente.
Las cosas que creo que podrían haber sido de ayuda son las siguientes:
- Construcción convertida para usar un esquema y espacio de trabajo de Xcode (en lugar de project & target)
- Espacio de trabajo reorganizado para tener el proyecto de la aplicación y la biblioteca estática como hermanos (no como padre / hijo)
- Cambió la configuración de Xcode y del espacio de trabajo para usar las ubicaciones de compilación especificadas en los objetivos
- Change Build Products Path para App y Library para usar ../build (ambos archivos de proyecto están contenidos en subcarpetas de hermanos de un directorio maestro, por lo que tenerlos compilados en la misma carpeta solucionó el problema original del comando linker / Ld, creo )
- Editó el esquema de la aplicación para construir explícitamente el objetivo de la biblioteca y construirlo antes del objetivo de la aplicación
- En las Fases de compilación para el objetivo de la aplicación, agregue explícitamente la Biblioteca en "Enlace binario con bibliotecas"
- Cambie el tipo de ubicación de la referencia del archivo .a de la biblioteca a "Relativo a los productos de compilación"
- Se agregó una fase de compilación "Copiar cabeceras" al proyecto Biblioteca, se agregaron los encabezados correspondientes a la sección Público.
- Cambió la ruta de la carpeta de encabezados públicos del proyecto de biblioteca a "/ include"
- 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 de la aplicación a
$(BUILT_PRODUCTS_DIR)
(recursivo) - Se agregó un comando Clean antes de la compilación en mi servidor de compilación Jenkins
- Se agregaron argumentos SDK y Arch explícitos al comando de compilación
- Se eliminaron los espacios del nombre de la configuración de compilación
El comando de compilación final se ve así:
xcodebuild -workspace ClientName.xcworkspace -scheme AppName -configuration "ProdAdHoc" -sdk iphoneos -arch "armv6 armv7"
Algunos recursos útiles que utilicé para depurar este problema:
- http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/
- https://devforums.apple.com/thread/91711?start=25&tstart=0
De todos modos, espero haber salido con suficientes palabras clave arriba que cualquier persona que tenga problemas de construcción similares en el futuro tropieza con esto y lo encuentra útil. No tengo idea de cómo un flujo de trabajo que hice muchas veces en Xcode 3.x se volvió tan desordenado cuando me mudé a Xcode 4, aquí espero que Apple pueda solucionar esto en versiones futuras.
Esta fue una gran experiencia de aprendizaje para mí, y al pasar por todo esto pareció aclarar los problemas con el autocompletado que estaba teniendo de antemano. Diré que las cosas podrían haber sido mucho peores; Todavía podría estar desarrollando para SharePoint.
Personalmente, tuve este problema cuando estaba desarrollando una static library
. Tenía el objetivo de static library
con todo el código de producción y un objetivo de prueba que MyStaticLib.a
archivo MyStaticLib.a
como un marco.
Las pruebas funcionaron bien en Xcode, pero no en el terminal usando xcodebuild
. El problema terminó siendo que el objetivo de la static library
era compilar para Standard architectures
, mientras que el objetivo de prueba quería compilar para Standard architectures (including 64-bit)
. Al cambiar el objetivo de prueba a Standard architectures
solucionó todo.
Resuelvo el problema yendo a "Ruta de búsqueda de la biblioteca" y me aseguro de que todas las entradas sean correctas.
Si observa el registro de la compilación, y le pide ver todos los mensajes, debería ver una línea concisa que dice "enlace ..." que tiene muy pocos detalles. Sin embargo, si hace clic con el botón derecho en esa línea y selecciona "expandir todas las transcripciones" obtendrá una línea muy detallada que le indicará qué comando se emitió desde XCode.
Eso debería ayudarte a depurar el problema.
Dave
Tuve una excepción similar, resultó que recibí alguna referencia (nula) en project.pbxproj después de limpiar esas referencias nulas en project.pbxproj, la compilación de la línea de comandos fue exitosa, como lo hace el xcode. Eche un vistazo al proyecto Xcode 4: utilidad para limpiar el archivo pbxproj? utility-to-clean-up-pbxproj-file
para más referencia