Ubuntu Linux の場合:
sudo apt-get install llvm
sudo apt-get install clang
sudo apt-get install libblocksruntime-dev
test.c
:
#include <stdio.h>
int main() {
void (^hello)(void) = ^(void) {
printf("Hello, block!\n");
};
hello();
return 0;
}
コンパイル:
clang test.c -fblocks -lBlocksRuntime -o test
./test
Hello, block!
正常に動作します。
技術的な背景情報:
ブロック自体は言語機能ですが、ランタイム サポートも必要です。したがって、コンパイラがランタイム ライブラリを提供してビルド プロダクトに静的にリンクするか、システムがビルド プロダクトをリンクできるランタイム ライブラリを提供する必要があります。
macOS の場合、ブロック ランタイムは libSystem の一部であり、macOS のすべての実行可能ライブラリと動的ライブラリは libSystem に対してリンクされているため、それらはすべてブロックをサポートしています。
Linux システムでは、このようなランタイム サポートは、システムまたは言語のコア機能と見なされた場合、通常は libC ライブラリ (ほとんどの場合 glibc) に追加されますが、gcc は現在ブロックをまったくサポートしておらず、サポートされているかどうかは不明です。ブロックは公式の C 機能になる予定であり、Linux システムはデフォルトでブロックのランタイム サポートを出荷していません。
clang 自体は、コンパイラ ランタイム ライブラリの一部としてターゲットに依存しないブロック ランタイムを提供しますが、これはオプションであり、多くの Linux システムでは clang インストール パッケージに含まれていないようです。そのため、プロジェクト blocksruntime が作成されました。これは、clang ブロック ランタイム サポートを独自のライブラリとして構築し、プロジェクトに静的にリンクしたり、システムに動的にインストールしたりできます。ソース コードは GitHub で入手できます。
Linux ディストリビューションによっては、すぐに使用できるインストーラー パッケージが存在する場合があります。 blocksruntime は Linux 用にコンパイルするだけでなく、FreeBSD または Windows (MinGW/Mingw-w64) 用にコンパイルすることも、Apple が提供するランタイムを使用したくない場合は Mac 用にコンパイルすることもできます。理論的には、clang がネイティブにサポートするすべてのプラットフォームに移植できるはずです。
少なくとも 2010 年の初めの時点では、ブロックを使用する clang プログラムに対してどのライブラリをリンクする必要があるかから判断すると、これを修正する簡単な方法はないようです。