2012-02-18 42 views
10

Tôi đang học ngôn ngữ Mục tiêu-C. Vì tôi không có máy Mac, tôi đang biên dịch và chạy mã của mình trong nền tảng Ubuntu 11.04.Các vấn đề khi biên dịch Mục tiêu C với Clang (Ubuntu)

Cho đến bây giờ, tôi đã sử dụng gcc để biên dịch. Tôi đã cài đặt GNUStep và tất cả đều hoạt động. Nhưng sau đó tôi bắt đầu thử một số tính năng Objective-C 2.0, như @property và @synthesize, mà gcc không cho phép.

Vì vậy, tôi đã cố gắng biên dịch mã bằng Clang, nhưng có vẻ như nó không liên kết chính xác mã của tôi với các thư viện GNUStep, ngay cả với chương trình Hello world đơn giản.

Ví dụ, nếu tôi biên dịch đoạn mã sau:

#import <Foundation/Foundation.h> 

int main(void) { 
    NSLog(@"Hello world!"); 
    return 0; 
} 

Đầu ra của trình biên dịch là:

/tmp/cc-dHZIp1.o: In function `main': 
test.m:(.text+0x1f): undefined reference to `NSLog' 
/tmp/cc-dHZIp1.o: In function `.objc_load_function': 
test.m:(.text+0x3c): undefined reference to `__objc_exec_class' 
collect2: ld returned 1 exit status 
clang: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation) 

Lệnh Tôi đang sử dụng để biên dịch là

clang -I /usr/include/GNUstep/ test.m -o test 

với chỉ thị -I để bao gồm các thư viện GNUStep (nếu không, Clang không thể tìm thấy Foundation.h).

Tôi đã giải quyết được sự cố của mình và truy cập cả hai trang web GNUStep và Clang, nhưng tôi chưa tìm thấy giải pháp cho nó. Vì vậy, bất kỳ trợ giúp sẽ được đánh giá cao.

Cảm ơn!

Trả lời

1

Bạn có thể thử biên dịch gcc:
Trước hết cài đặt GNU Objective-C Runtime: sudo apt-get install gobjc
sau đó biên dịch: gcc -o hello hello.m -Wall -lobjc

+0

Xin chào URLArenzo.Tôi đã cài đặt gói đó rồi thử dùng gcc để biên dịch (nó hoạt động hoàn hảo). Tuy nhiên, tôi đã tìm ra rằng gcc không cho phép một số tính năng của Objective-C 2.0; vì vậy tôi đang cố gắng để làm cho mọi thứ chạy với trình biên dịch Clang. –

6

Vấn đề là các thư viện gnustep-base đã không được sử dụng bởi các mối liên kết. Vì vậy, các giải pháp này đã được sử dụng tùy chọn -Xlinker, mà gửi đối số cho các mối liên kết được sử dụng bởi kêu vang:

clang -I /usr/include/GNUstep/ -Xlinker -lgnustep-base test.m -o test 

Những tuyên bố "-X mối liên kết -lgnustep-base" made sự kỳ diệu. Tuy nhiên, tôi đã có vấn đề với lệnh này liên quan đến các lớp đại diện một chuỗi trong Objective-C:

./test: Uncaught exception NSInvalidArgumentException, reason: GSFFIInvocation: 
Class 'NXConstantString'(instance) does not respond to forwardInvocation: for 
'hasSuffix:' 

tôi có thể giải quyết nó thêm tham số "-fconstant-string-class = NSConstantString":

clang -I /usr/include/GNUstep/ -fconstant-string-class=NSConstantString \ 
-Xlinker -lgnustep-base test.m -o test 

Ngoài ra, tôi đã thử với một số đoạn mã Objective-C 2.0 và có vẻ như nó hoạt động.

Cảm ơn sự giúp đỡ của bạn!

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