2011-09-19 12 views
16

Aquí hay una muy simple aplicación de consola de Objective-C:compilar un Objective-C aplicación de línea de comandos IOS través de gcc en Mac

#import <Foundation/Foundation.h> 
#import <CoreLocation/CoreLocation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 
    NSLog(@"Hello world!"); 

    [pool drain]; 

    return 0; 
} 

compilo con gcc main.m -o main -ObjC -framework Foundation -framework CoreLocation en mi Mac.

También tengo el iOS SDK instalado en mi mac. ¿Cómo puedo modificar este comando a compilar el mismo código, en mi computadora, para usar en un dispositivo iOS (jailbroken)?

Podría transferir el ejecutable a través de ssh y firmarlo con ldid.

Respuesta

4

Suponiendo que no estamos aferrados a rancio viejo GCC, lo que provocó deliberadamente errores en mi proyecto con el fin de llegar a una posición donde Xcode revelará la línea de comandos utilizada reveló lo siguiente para su compilación:

/desarrollador /Platforms/iPhoneOS.platform/Developer/usr/bin/clang -x objetivo-c -arch armv6 -fmessage-length = 0 -fdiagnostics-print-source-range-info -fdiagnostics-show-category = id - fdiagnostics-parseable-fixits -std = gnu99 -Wno-trigraphs -fpascal-strings -O0 -Wmissing-prototypes -Wreturn-type -Wparentheses -Wswitch -Wno-unused-parameter -Wunu SED variable -Wunused-valor -DDEBUG = 1 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -gdwarf-2 -mthumb "-DIBOutlet = atributo ((IBOutlet))" "-DIBOutletCollection (NombreClase) = atributo ((iboutletcollection (NombreClase)))" "-DIBAction = void) atributo ((IBAction)" -miphoneos-versión-min = 3,2 -iquote [ un archivo de contabilidad] -I [una lista de encabezados] -lista [más encabezados] -I [una ruta de acceso incluida] -fpch-preprocess -F [puntero al directorio para archivos de depuración] -include [mi prefijo de encabezado] -c AppDelegate.m -o AppDelegate. o

Si está disminuyendo el uso de Xcode entonces supongo que puede cortar las cosas sobre las salidas de Interface Builder por lo menos. Y construir para armv6 en lugar de v7 es probablemente un error en mi proyecto.

Y luego, al enlace:

/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang -arch -isysroot ARMv6 /Developer/Platforms/iPhoneOS.platform/Developer/ SDKs/iPhoneOS4.3.sdk -L [algo apropiado] -F [algo apropiado] -filelist [a .LinkFileList] -dead_strip -miphoneos-version-min = 3.2 -framework SystemConfiguration -framework UIKit -framework Foundation -framework CoreGraphics -o [algo apropiado]

El archivo .LinkedFileList parece ser solo una lista de archivos de objeto, uno por línea. Xcode ha puesto el camino completo a cada uno de ellos, aunque supongo que las rutas relativas serán aceptables.

Agradezco que esta no sea una respuesta completa, pero espero que ayude?

2

¿Por qué no usar xcodebuild en lugar de llamar directamente al gcc?

+0

no es ' xcodebuild' destinado a la compilación de proyectos de Xcode solamente? Me preguntaba cómo evitar el uso de Xcode. – Klaus

+4

Oh. Por supuesto. Entonces quizás puedas hacer esto: crea un proyecto iOS Xcode, luego llama a 'xcodebuild' desde la línea de comandos ... y observa las llamadas a gcc que está realizando en la línea de comando. Entonces debería poder ver qué parámetro de línea de comando usa ... Nad debería ser capaz de usarlo usted mismo usando 'gcc' sin' xcodebuild' – AliSoftware

+0

Esto es lo que ** I ** estaba buscando, ¡gracias! – To1ne

18

Para los casos simples, esto podría ser lo suficientemente bueno:

gcc -o output -Wall -std=c99 source.m -framework Foundation -lobjc 

Actualización:

Este comando no funciona para una aplicación de línea de comandos IOS - el arco debe ajustarse correctamente. No tengo un entorno de desarrollo de iOS a la mano actualmente; probablemente la bandera de mar ayudaría.

Ver la respuesta aceptada.

+0

¡Agradable! Esto funciona;) – diegocaro

+0

También puede reemplazar 'gcc' con' clang' sin cambiar nada más aquí. –

+1

@keith: Sí, esta es probablemente la respuesta correcta en el futuro. Apple podría dejar de enviar el contenedor gcc en torno al clang en algún momento. – radiospiel

4

Para compilar el código de iOS en su mac, debe usar el compilador cruzado, es decir, un compilador que se ejecuta en una plataforma Intel y que es capaz de generar código binario ARM.

Xcode proporciona un compilador cruzado de este tipo. Se encuentra al (asumiendo que está usando Xcode 4.3 distribuido desde la App Store)

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 

Para un tipo simple "hola mundo" del programa, soy compilar usando

alias c="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2" 
c -o hello hello.c -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ 
+0

¡Eso funcionó muy bien! ¡Gracias! – daviewales

Cuestiones relacionadas