6

Linuxで次のコードをコンパイルするにはどうすればよいですか?Ubuntu 10.10(Maverick Meerkat)を使用します。

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

int main(){
  void(^ block)()= ^ {
    printf( "Hello world");
  };
  ブロック();
}

私は試した:

gcc-xObjective-ctc 

そして得た:

tc:関数'main'内:
tc:5:エラー:予期される識別子または「^」トークンの前の「(」

この作業を行う方法についてのガイダンスをいただければ幸いです。フィードバックに基づいて編集された質問、ありがとう。

4

3 に答える 3

10

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

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

Linuxでブロックを使用してobjective-cをサポートする最も簡単な方法は、GNUStepベースの最新のclangと最新のスナップショットに加えてGNUStepのObjectiveC2フレームワークをインストールすることです。ディストリビューションに、最新のランタイムやコンパイラーでうまく機能するのに十分なほど新しいGNUStep関連のパッケージが含まれている可能性はほとんどありません。

于 2011-01-10T09:40:10.880 に答える
0

はい、簡単な答えですが、多少の作業が必要になる場合があります。

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

于 2011-01-10T09:22:59.020 に答える
0

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

@ user57368は最初の段落では正しいですが、(元の質問に基づいて)最後の2つの段落にいくつかの「問題」があります。

GCD(Grand Central Dispatcherと呼ばれるAppleの「優れた」スレッドツール)は、「dispatch_*」機能を提供するlibdispatchを利用するランタイムスレッドです。GCDは、ブロック構造を使用することにより、非常に有効に活用されます(そして、コードを「より洗練された」ものにします)。ただし、dispatch_ *関数呼び出しの関数バージョンがあるため、 GCDはブロックを必要としません。

ブロックは言語lamdbaベースの構成であり、GCD/libdispatch機能に依存したり提供したりすることはありません。これらは両方ともMacOSX/iOS / Xcodeの世界で同時にAppleによって導入されましたが、相互に依存していません。

PS:最近見たFreeBSDのlibdispatch実装があり、Linuxにもオプションを実装する試みがいくつかあります。

于 2016-10-24T08:58:54.997 に答える