2011-01-10 10 views
6

linuxで次のコードをコンパイルするにはどうすればよいですか? Ubuntu 10.10(Maverick Meerkat)を使用しています。Objective-CブロックはLinux上のコンパイラでサポートされていますか?

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

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

私が試した:

 
gcc -x objective-c t.c 

をそして得た:

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

をこの作業を行う方法上の任意の案内が認識されます。フィードバックに基づいて質問を編集しました。ありがとうございます。

+1

試しましたか?それはあなたの質問に答えるかもしれません.... – Jasarien

+1

LinuxでObjective-Cコードをコンパイルするための "the"ツールがないので、彼は試行錯誤して別のツールを探していたかもしれません。 – Alfonso

+0

申し訳ありませんが、私はコンパイルしようとしました。質問を更新して詳細を確認しました。私はGoogle検索を行い、メインラインgccに受け入れられていないブロックについて読んでいます。コンパイルのために単純なコードを投稿するのに十分な情報が見つかりませんでした。 – user565452

答えて

9

公式のGCCにはブロックサポートは含まれていません。そのためには、Appleのパッチを使うか、(Appleが開発資金を調達しているので)良いObjective-Cサポートを持つLLVMベースのコンパイラclangを使う必要があります。 Linuxでは、AppleのパッチをGCCに適用しようとしない方がよいでしょう。ちょうどclangと一緒に行く。

しかし、単にブロックをサポートするコンパイラを使用するだけでは不十分です。実行時にもブロックをサポートする必要があります。 linux上でGNUStepに使用できるランタイムは2つあり、BSDにも1つあります(libdispatchはFreeBSDに移植されており、ブロック対応のランタイムが必要です)。

Linux上のブロックでobjective-cサポートを入手する最も簡単な方法は、GNUStepの最新のclangと最新のスナップショットとObjectiveC2フレームワークをインストールすることです。あなたのディストリビューションには最新のランタイムとコンパイラでうまく動作するようなGNUStep関連のパッケージがあります。

+0

答えをありがとう! – user565452

+1

ここでは、ブロックとARCを含むLinux上のすべてをビルドする方法を段階的に示します。 http://feloneouscat.wordpress.com/2013/10/25/objective-c-on-ubuntu-12-04-with-blocks-and-arc/ –

0

はい、短い答えですが、いくつかの作業が必要な場合があります。

Appleがオープンソースコンパイラ(GCCとLLVM)を使っているので、Linuxに移植できない理由はありません。誰かが実際にこの仕事をしているかどうかはわかりません。わずかにペダンティックであるために、ブロックはCレベルで実装されています。つまり、ブロックを取得するのは比較的簡単ですが、それらを使用するライブラリの多くを見逃すことになります。ロビンが言っているように、UIは主要なものですが、になります。GCDです。

0

(私は私の評判が十分に高くないので、それがこの「答え」の理由ですので、私はまだ、コメントすることはできませんという事実を嫌う)

user57368 @しかし、最初の段落に正しいです

GCD(Grand Central Dispatcherと呼ばれるアップルの「すばらしい」スレッドツールは、libdispatchを利用したランタイムスレッドであり、ディスパッチ_ * "のfuntions。 GCDは、ブロック構造を使用することで、大いに役立ちます(そしてコードをより良くします)。 HOWEVER GCDはではありません。には、dispatch_ *関数呼び出しの関数バージョンがあります。

ブロックは言語ベースの構造体であり、GCD/libdispatchの機能に依存せず、提供もしません。 MacOSX/iOS/Xcodeの世界でアップルが同時に導入したのですが、お互いに依存していません。

PS:最近私が見たFreeBSD用のlibdispatchの実装と、Linuxでもオプションを実装しようとする試みがあります。

関連する問題