通过mac上的gcc编译iOS Objective-C命令行应用程序

时间:2011-09-19 15:19:28

标签: ios gcc jailbreak

这是一个非常简单的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;
}

我在Mac上用gcc main.m -o main -ObjC -framework Foundation -framework CoreLocation编译它。

我的Mac上也安装了iOS SDK。如何修改此命令以编译相同的代码在我的计算机上,以便在(越狱的)iOS设备上使用

然后,我可以通过ssh传输可执行文件,并使用ldid进行签名。

4 个答案:

答案 0 :(得分:18)

对于简单的情况,这可能已经足够了:

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

<强>更新

此命令不适用于iOS命令行应用程序 - 必须正确设置arch。我目前没有iOS开发环境;可能是-march标志会有所帮助。

请参阅接受的答案。

答案 1 :(得分:4)

假设你没有与老式的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 -Wmissing-prototypes -Wreturn-type -Wparentheses   -Wswitch -Wno-unused-parameter -Wunused-variable -Wunused-value   -DDEBUG = 1 -isysroot   /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk   -gdwarf-2 -mthumb“-DIBOutlet = attribute ((iboutlet))”   “-DIBOutletCollection(类名)= <强>属性((iboutletcollection(类名)))”   “-DIBAction = void”属性((ibaction)“ - miphoneos-version-min = 3.2   -iquote [簿记文件] -I [标题列表] -iquote [更多   header] -I [包含路径] -fpch-preprocess -F [指向目录的指针   对于调试文件] -include [my prefix header] -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 [a   .LinkFileList] -dead_strip -miphoneos-version-min = 3.2 -framework   SystemConfiguration -framework UIKit -framework Foundation-framework   CoreGraphics -o [适当的]

.LinkedFileList文件似乎只是一个目标文件列表,每行一个。 Xcode已经将完整的路径放在那里,尽管我猜测相对路径是可以接受的。

我很欣赏这不是一个完整的答案,但希望它有帮助吗?

答案 2 :(得分:4)

要在Mac上编译iOS代码,您需要使用交叉编译器,即在Intel平台上运行并能够生成ARM二进制代码的编译器。

Xcode确实提供了这样的交叉编译器。它位于(假设您使用的是从App Store分发的Xcode 4.3)

/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/

答案 3 :(得分:2)

为什么不使用xcodebuild而不是直接拨打gcc