2011-09-19 27 views
16

Đây là một rất đơn giản Objective-C giao diện điều khiển ứng dụng:Biên soạn một Objective-C ứng dụng dòng lệnh iOS thông qua gcc trên 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; 
} 

tôi biên dịch nó với gcc main.m -o main -ObjC -framework Foundation -framework CoreLocation trên máy Mac của tôi.

Tôi cũng đã cài đặt iOS SDK trên máy Mac của mình. Làm cách nào để sửa đổi lệnh này thành biên dịch cùng mã, trên máy tính của tôi, để sử dụng trên thiết bị iOS (jailbroken)?

Sau đó tôi có thể chuyển tệp thi hành qua ssh và ký tên với ldid.

Trả lời

4

Giả sử bạn không gắn bó với xưa cũ GCC, cố tình gây ra những sai sót trong dự án của tôi để nhận được vào một vị trí mà Xcode sẽ tiết lộ dòng lệnh sử dụng tiết lộ sau đây cho biên soạn:

/Developer /Platforms/iPhoneOS.platform/Developer/usr/bin/clang -x Mục tiêu-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-prototype Kiểu -Wurnurn -Wparentheses -Wswitch -Wno-unused-parameter -Wunu sed biến -Wunused giá trị -DDEBUG = 1 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -gdwarf-2 -mthumb "-DIBOutlet = thuộc tính ((IBOutlet))" "-DIBOutletCollection (ClassName) = thuộc tính ((iboutletcollection (ClassName)))" "-DIBAction = void) thuộc tính ((IBAction)" -miphoneos phiên bản-min = 3.2 -iquote [ tệp sổ sách kế toán] -I [danh sách tiêu đề] -iquote [hơn tiêu đề] -I [đường dẫn bao gồm] -fpch-preprocess -F [trỏ tới thư mục để gỡ lỗi tệp] -bao gồm [tiêu đề tiền tố của tôi] -c AppDelegate.m -o AppDelegate. o

Nếu bạn đang từ chối sử dụng Xcode thì tôi cho rằng bạn có thể cắt ít nhất về các cửa hàng Trình tạo giao diện. Và xây dựng cho armv6 hơn là v7 có lẽ là một lỗi trong dự án của tôi.

Và sau đó, để liên kết:

/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang -arch ARMv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/ SDK/iPhoneOS4.3.sdk -L [điều gì đó phù hợp] -F [điều gì đó phù hợp] -filelist [a .LinkFileList] -dead_strip -miphoneos-version-min = 3.2 -framework SystemConfiguration -framework UIKit -framework Foundation -framework CoreGraphics -o [một cái gì đó thích hợp]

Tệp .LinkedFileList dường như chỉ là một danh sách các tệp đối tượng, mỗi tệp một dòng. Xcode đã đặt đường dẫn đầy đủ vào mỗi trong đó, mặc dù tôi đoán các đường dẫn tương đối có thể chấp nhận được.

Tôi đánh giá cao đây không phải là câu trả lời đầy đủ, nhưng hy vọng nó sẽ giúp ích?

2

Tại sao không sử dụng xcodebuild thay vì gọi trực tiếp gcc?

+0

Không phải là ' xcodebuild' có nghĩa là để biên dịch các dự án Xcode chỉ? Tôi tự hỏi làm thế nào để tránh sử dụng Xcode. – Klaus

+4

Ồ. Chắc chắn rồi. Sau đó, có thể bạn có thể làm điều này: tạo một dự án Xcode iOS, sau đó gọi 'xcodebuild'from dòng lệnh ... và quan sát các lệnh gọi đến gcc mà anh ta đang thực hiện trong dòng lệnh. Sau đó, bạn sẽ có thể xem những gì tham số dòng lệnh nó sử dụng ... Nad sẽ có thể sử dụng nó cho mình bằng cách sử dụng 'gcc' mà không' xcodebuild' – AliSoftware

+0

Đây là những gì ** tôi ** đang tìm kiếm, cảm ơn! – To1ne

18

Đối với trường hợp đơn giản này có thể là đủ tốt:

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

Cập nhật:

Lệnh này không làm việc cho một dòng lệnh ứng dụng iOS - vòm phải được thiết lập một cách chính xác. Tôi hiện không có môi trường phát triển iOS; có lẽ lá cờ -march sẽ giúp ích.

Xem câu trả lời được chấp nhận.

+0

Đẹp! Điều này hoạt động;) – diegocaro

+0

Bạn cũng có thể thay thế 'gcc' bằng' clang' mà không thay đổi gì khác ở đây. –

+1

@keith: Vâng, đây có lẽ là câu trả lời đúng trong tương lai. Apple có thể ngừng vận chuyển gcc wrapper quanh clang tại một số điểm. – radiospiel

4

Để biên dịch mã iOS trên máy Mac, bạn cần sử dụng trình biên dịch chéo, tức là trình biên dịch chạy trên nền tảng Intel và có thể tạo mã nhị phân ARM.

Xcode cung cấp trình biên dịch chéo như vậy. Nó tọa lạc tại (giả sử bạn đang sử dụng Xcode 4.3 phân phối từ App Store)

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

Đối với một loại đơn giản, "hello world" của chương trình, tôi đang biên soạn sử dụng

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

Điều đó hoạt động tốt! Cảm ơn! – daviewales

Các vấn đề liên quan