Скомпилируйте приложение командной строки iOS Objective-C через gcc на mac - PullRequest
16 голосов
/ 19 сентября 2011

Вот очень простое консольное приложение Objective-C:

#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;
}

Я компилирую его с gcc main.m -o main -ObjC -framework Foundation -framework CoreLocation на моем Mac.

У меня также установлен iOS SDK на моем Mac,Как я могу изменить эту команду, чтобы скомпилировать тот же код, на моем компьютере , для использования на (взломанном) устройстве iOS ?

Затем я мог бы перенести исполняемый файлчерез ssh и подпишите его ldid.

Ответы [ 4 ]

18 голосов
/ 22 февраля 2012

Для простых случаев это может быть достаточно:

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

Обновление:

Эта команда не работает для приложения командной строки iOS - арка должнабыть настроен правильно.В настоящее время у меня нет среды разработки для iOS;возможно, поможет флаг -march.

См. принятый ответ.

4 голосов
/ 15 марта 2012

Для компиляции кода iOS на вашем Mac вам нужно использовать кросс-компилятор, то есть компилятор, работающий на платформе Intel и способный генерировать двоичный код ARM.

Xcode действительно обеспечивает такой кросс-компилятор.Он находится по адресу (при условии, что вы используете Xcode 4.3, распространяемый из App Store)

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

Для простой программы типа "hello world" я компилирую с использованием

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/
4 голосов
/ 19 сентября 2011

Предполагая, что вы не привязаны к старому GCC, преднамеренно вызывая ошибки в моем проекте, чтобы попасть в положение, когда Xcode покажет используемую командную строку, обнаружил следующее для компиляции:

/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang -x target-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-прототипы -Wreturn-тип -Wparentheses -Wswitch -Wno-unused-параметр -Wunused-variable -Wunused-value -DDEBUG = 1 -isysroot/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -gdwarf-2 -mthumb "-DIBOutlet = атрибут ((iboutlet))" "-DIBOutletCollection (ClassName) = attribute ((iboutletcollection (ClassName))) "" -DIBAction = void) attribute ((ibaction) "-miphoneos-version-min = 3.2 -iquote [файл учета] -I [список заголовков] -iquote [больше заголовков] -I [aninclude path] -fpch-preprocess -F [указатель на каталог для файлов отладки] -include [заголовок моего префикса] -c AppDelegate.m -o AppDelegate.o

Если вы отказываетесь от использованияиз XCode тогда я думаю, что вы можете сократить материал о выходах Interface Builder по крайней мере.И сборка для armv6, а не для v7, вероятно, является ошибкой в ​​моем проекте.

И затем ссылка:

/ Developer / Platforms / iPhoneOS.platform / Developer / usr / bin/ clang -arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -L [что-то соответствующее] -F [что-то соответствующее] -filelist [.LinkFileList] -dead_strip -miphoneos-version-min = 3.2 -framework SystemConfiguration -framework UIKit -framework Foundation -framework CoreGraphics -o [что-то подходящее]

Файл .LinkedFileList выглядит просто как список объектных файлов, по одному на строку.В Xcode указан полный путь к каждому из них, хотя я предполагаю, что относительные пути будут приемлемыми.

Я понимаю, что это не полный ответ, но, надеюсь, это поможет?

2 голосов
/ 19 сентября 2011

Почему бы не использовать xcodebuild вместо прямого вызова gcc?

...