2011-09-19 21 views
16

编译iOS的Objective-C的命令行应用程序这是一个非常简单的Objective-C的控制台应用程序:通过GCC在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; 
} 

gcc main.m -o main -ObjC -framework Foundation -framework CoreLocation我的Mac上进行编译。

我还在我的Mac上安装了iOS SDK。如何修改此命令至在我的电脑上编译相同的代码,用于(越狱)iOS设备

我可以通过ssh传输可执行文件并用ldid对其进行签名。

回答

4

假设你不拘泥于古板的老旧GCC,故意引发了我的项目错误,从而进入一个位置的Xcode将揭示使用的命令行透露编译如下:

/开发人员/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 -fascal-strings -O0 -Wmissing-prototypes -Wreturn-type -Wparentheses -Wwitwit -Wno-unused-parameter -Wunu SED-可变-Wunused值 -DDEBUG = 1 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -gdwarf-2 -mthumb“-DIBOutlet = 属性((IBOutlet中))” “-DIBOutletCollection(类名)= 属性((iboutletcollection(类名)))” “-DIBAction =空隙)属性((IBAction为)” -miphoneos版本分钟= 3.2 -iquote [记录文件] -I [标题列表] -iquote [更多 标题] -I [包含路径] -fpch-preprocess -F [调试文件的目录 的指针] -include [my prefix header] -c AppDelegate.m -o AppDelegate。 0

如果你拒绝使用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

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

+0

编译不是' xcodebuild“仅用于编译Xcode项目?我想知道如何避免使用Xcode。 – Klaus

+4

哦。当然。那么也许你可以这样做:创建一个iOS Xcode项目,然后从命令行调用'xcodebuild'并观察他在命令行中执行的gcc调用。那么你应该能够看到它使用的是什么命令行参数...... Nad应该可以使用'gcc'来自己使用它,而不需要'xcodebuild' – AliSoftware

+0

这是** I **寻找的东西,谢谢! – To1ne

18

对于简单的情况下,这可能是不够好:

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

更新:

此命令不适用于在iOS命令行应用程序的工作 - 拱必须正确设置。目前我手头没有iOS开发环境;可能这个-march标志会有所帮助。

查看接受的答案。

+0

不错!这是有效的;) – diegocaro

+0

你也可以用'clang'替换'gcc'而不改变其他的东西。 –

+1

@keith:是的,这可能是未来的正确答案。苹果可能会在某个时候停止发运gcc包装。 – radiospiel

4

要在您的mac上编译iOS代码,您需要使用交叉编译器,即在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/ 
+0

这很好用!谢谢! – daviewales