2011-01-10 35 views
6

Làm cách nào để biên dịch mã sau trên Linux? Sử dụng Ubuntu 10.10 (Maverick Meerkat).Các khối Objective-C có được hỗ trợ bởi các trình biên dịch trên Linux không?

 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    void (^block)() = ^{ 
    printf("Hello world"); 
    }; 
    block(); 
} 

tôi đã cố gắng:

 
gcc -x objective-c t.c 

Và có:

 
t.c: In function 'main': 
t.c:5: error: expected identifier or '(' before '^' token 

Bất kỳ hướng dẫn về làm thế nào để làm cho công việc này được đánh giá cao. Câu hỏi được chỉnh sửa dựa trên phản hồi, cảm ơn.

+1

Bạn đã thử chưa? Điều đó có thể trả lời câu hỏi của bạn .... – Jasarien

+1

Không có công cụ "" để biên dịch mã Objective-C trong Linux, do đó, anh có thể đã thử và thất bại, và bây giờ tìm kiếm một công cụ khác. – Alfonso

+0

Xin lỗi các bạn, tôi đã cố gắng biên dịch. Tôi đã cập nhật câu hỏi để có thêm chi tiết. Tôi đã thực hiện tìm kiếm trên google và đọc về các khối không được chấp nhận vào gcc chính. Tôi không thể tìm đủ thông tin để lấy mã đơn giản được đăng để biên dịch. – user565452

Trả lời

9

GCC chính thức không bao gồm hỗ trợ chặn. Để làm được điều đó, bạn cần sử dụng các bản vá của Apple, hoặc sử dụng clang, một trình biên dịch dựa trên LLVM có hỗ trợ Objective-C tốt (vì Apple đã tài trợ cho sự phát triển của nó). Trên Linux, có lẽ bạn nên cố gắng không áp dụng các bản vá lỗi của Apple cho GCC. Chỉ cần đi với tiếng kêu.

Tuy nhiên, chỉ đơn giản là có trình biên dịch hỗ trợ khối không đủ - thời gian chạy cũng cần hỗ trợ các khối. Có hai runtimes bạn có thể sử dụng với GNUStep trên Linux, và có một cho BSD là tốt (libdispatch đã được chuyển sang FreeBSD, và nó yêu cầu một thời gian chạy có khả năng chặn). Cách nhanh nhất để nhận hỗ trợ khách quan-c với các khối trên linux có lẽ là cài đặt clang mới nhất và ảnh chụp mới nhất của GNUStep-base cộng với khung ObjectiveC2 từ GNUStep. Không có khả năng bản phân phối của bạn có bất kỳ gói liên quan đến GNUStep nào đủ mới để hoạt động tốt với các thời gian chạy và trình biên dịch mới nhất.

+0

Cảm ơn bạn đã trả lời! – user565452

+1

Đây là bước từng bước về cách xây dựng mọi thứ trên Linux bao gồm Blocks và ARC. http://feloneouscat.wordpress.com/2013/10/25/objective-c-on-ubuntu-12-04-with-blocks-and-arc/ –

0

Có câu trả lời ngắn nhưng có thể yêu cầu một số công việc.

Câu trả lời dài hơn là Apple sử dụng các trình biên dịch nguồn mở (GCC và LLVM) để không có lý do gì khiến chúng không thể được chuyển sang Linux. Cho dù bất cứ ai đã thực sự làm công việc này tôi không biết. Để được một chút pedantic, khối được thực hiện ở cấp độ C như vậy. Điều này có nghĩa là việc nhận các khối sẽ tương đối dễ dàng nhưng bạn sẽ bỏ lỡ nhiều thư viện sử dụng chúng. Như robin nói, giao diện người dùng là giao diện người dùng chính nhưng bạn sẽ có thể chuyển đến cổng GCD.

0

(Tôi ghét thực tế là tôi chưa thể bình luận kể từ khi danh tiếng của tôi không đủ cao, vì vậy đó là lý do của việc "câu trả lời" này)

@ user57368 là chính xác trong đoạn đầu tiên, tuy nhiên, có (Dựa trên câu hỏi ban đầu) một vài "vấn đề" với hai đoạn văn sau cùng:

GCD (công cụ "tuyệt vời" của Apple được gọi là Grand Central Dispatcher) là luồng thời gian chạy sử dụng libdispatch cung cấp " dispatch_ * "funtions. GCD thực hiện sử dụng tuyệt vời (và làm cho mã "đẹp hơn") bằng cách sử dụng các khối xây dựng. HOWEVER GCD không không cần các khối, vì có các phiên bản chức năng của các cuộc gọi hàm dispatch_ *.

Chặn là ngôn ngữ dựa trên cấu trúc lamdba, và không phụ thuộc vào, cũng như không cung cấp chức năng GCD/libdispatch. Cả hai đều được Apple giới thiệu cùng một lúc trong thế giới MacOSX/iOS/Xcode, nhưng chúng không phụ thuộc lẫn nhau.

PS: có một triển khai libdispatch cho FreeBSD tôi đã thấy gần đây và một số nỗ lực triển khai tùy chọn trên Linux.

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