Скомпилируйте приложение командной строки iOS Objective-C через gcc на mac

Вот очень простое консольное приложение 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. Как изменить эту команду на скомпилировать один и тот же код на моем компьютере для использования на устройстве с jailbroken iOS?

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

Ответы

Ответ 1

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

/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang -x objective-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 -Интеллектуальные прототипы -Выходные -Впутники -Wswitch -Wno-unused-parameter -Wunused-variable -Wunused-value -DDEBUG = 1 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -gdwarf-2 -mthumb "-DIBOutlet = ((iboutlet))" "-DIBOutletCollection (ИмяКласс) = атрибут ((iboutletcollection (ИмяКласс)))" "-DIBAction = void) атрибут ((ibaction)" -miphoneos-version-min = 3.2 -iquote [бухгалтерский файл] -I [список заголовков] -количество [больше заголовки] -I [путь включения] -fpch-preprocess -F [указатель на каталог для файлов отладки] -ключить [мой заголовок префикса] -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 [что-то подходящее] файлы [a.LinkFileList] -dead_strip -miphoneos-version-min = 3.2 -framework SystemConfiguration -framework UIKit -framework Foundation -framework CoreGraphics -o [что-то подходящее]

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

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

Ответ 2

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

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

Update:

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

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

Ответ 3

Чтобы скомпилировать код 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

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

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

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