2011-01-10 3 views
6

리눅스에서 다음 코드를 어떻게 컴파일합니까? 우분투 10.10 (Maverick Meerkat) 사용.Objective-C 블록은 Linux의 컴파일러에서 지원됩니까?

 
gcc -x objective-c t.c 

을 그리고있어 :

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

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

나는 시도

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

이 작업을하는 방법에 대한 지침이 감사합니다. 의견을 바탕으로 수정 된 질문입니다. 감사합니다.

+1

시도해 보셨습니까? 그게 당신의 질문에 대답 할 수 있습니다 .... – Jasarien

+1

Linux에서 Objective-C 코드를 컴파일하는 "the"도구가 없으므로 시도하고 실패했을 수 있으며 이제는 다른 도구를 검색합니다. – Alfonso

+0

죄송합니다. 컴파일하려고했습니다. 더 자세한 내용을 알기 위해 질문을 업데이트했습니다. 나는 Google 검색을하고 mainline gcc에 수용되지 않는 블록에 대해 읽었다. 나는 간단한 코드를 컴파일하기 위해 충분한 정보를 찾을 수 없었다. – user565452

답변

9

공식 GCC에는 블록 지원이 포함되어 있지 않습니다. 이를 위해서는 Apple의 패치를 사용하거나, 좋은 Objective-C를 지원하는 LLVM 기반 컴파일러 인 clang을 사용해야합니다 (Apple이 개발 자금을 지원했기 때문에). 리눅스에서는 GCC에 애플 패치를 적용하지 않는 것이 더 나을 것이다. 그냥 clang 함께 가라.

그러나 블록을 지원하는 컴파일러 만 있으면 충분하지 않습니다. 런타임도 블록을 지원해야합니다. 리눅스에서 GNUStep과 함께 사용할 수있는 런타임은 두 가지이며 BSD도 있습니다 (libdispatch는 FreeBSD로 이식되었으며 블록 가능 런타임이 필요했습니다).

Linux에서 블록을 사용하여 objective-c 지원을 얻는 가장 빠른 방법은 GNUStep의 ObjectiveC2 프레임 워크와 GNUStep-base의 최신 clang과 최신 스냅 샷을 설치하는 것입니다. 배포판에 최신 런타임 및 컴파일러와 잘 작동 할만큼 새로운 GNUStep 관련 패키지가있는 것은 아닙니다.

+0

답변 해 주셔서 감사합니다! – user565452

+1

다음은 블록 및 ARC를 포함하여 Linux에서 모든 것을 빌드하는 방법에 대한 단계별 설명입니다. http://feloneouscat.wordpress.com/2013/10/25/objective-c-on-ubuntu-12-04-with-blocks-and-arc/ –

0

예 짧은 답변이지만 약간의 작업이 필요할 수 있습니다.

애플이 오픈 소스 컴파일러 (GCC와 LLVM)를 사용하기 때문에 애플이 리눅스로 포팅 할 이유가 없다. 아무도 실제로이 작업을 수행했는지 여부는 알 수 없습니다. 약간 pedagonic하기 위해서 블록은 C 레벨에서 구현됩니다. 이것은 블록을 얻는 것이 상대적으로 쉽다는 것을 의미하지만, 그것을 사용하는 많은 라이브러리를 놓치고있는 것이다. 로빈 (Robin)이 말했듯이, UI는 주요한 것이지만 GCD 일 수 있습니다.

0

그러나, user57368 @

는 첫 번째 단락에서 올바른 (내 평판이 충분하지 않기 때문에 그이 "대답"에 대한 이유 그래서 나는 아직 언급 할 수 있다는 사실을 싫어) 마지막 두 단락에 몇 가지 "문제"가 있습니다 (원래의 질문에 기반).

GCD (Grand Central Dispatcher라고하는 Apple의 "위대한"스레딩 도구 인) GD는 libdispatch를 사용하는 런타임 스레딩입니다. dispatch_ * "funtions. GCD는 블록 구조를 사용하여 코드를 "더 멋지게"사용합니다. HOWEVER GCD는 이 아니며에는 블록이 필요합니다. dispatch_ * 함수 호출의 함수 버전이 있기 때문입니다.

블록은 언어 lamdba 기반 구조, 그리고에 따라,도 GCD/libdispatch 기능을 제공하지 않습니다. 그들은 MacOSX/iOS/Xcode 세계에서 동시에 애플에 의해 소개되었지만 서로 의존하지는 않습니다.

PS : 내가 최근에 본 FreeBSD를위한 libdispatch 구현, 너무 리눅스에서 옵션을 구현하는 몇 가지 시도가있다.