Na 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;
}
kompilace:
clang test.c -fblocks -lBlocksRuntime -o test
./test
Hello, block!
funguje dobře.
Technické informace:
Samotné bloky jsou jazykovou funkcí, ale také vyžadují určitou podporu za běhu. Takže buď kompilátor musí poskytnout runtime knihovnu a staticky ji propojit se sestavovacím produktem, nebo systém musí poskytnout takovou runtime knihovnu, se kterou lze sestavit produkt propojit.
V případě macOS je runtime bloků součástí libSystem a protože všechny spustitelné a dynamické knihovny v macOS jsou propojeny s libSystem, všechny mají podporu bloků.
Na linuxovém systému by taková runtime podpora byla obvykle přidána do knihovny libC (ve většině případů glibc), pokud by byla považována za základní vlastnost systému nebo jazyka, ale protože gcc v současné době nemá žádnou podporu pro bloky a není známo, zda bloky se někdy stanou oficiální funkcí jazyka C, systémy Linux standardně nedodávají runtime podporu pro bloky.
clang sám o sobě nabízí běhové prostředí bloků nezávislé na cíli jako součást běhové knihovny kompilátoru, přesto je volitelné a zdá se, že mnoho linuxových systémů do instalačního balíčku clang nezahrnuje. Proto byl vytvořen projekt blockruntime, který staví runtime podporu clang bloků jako vlastní knihovnu, kterou můžete staticky propojit do svých projektů nebo dynamicky instalovat do svých systémů. Zdrojový kód je dostupný na GitHubu.
V závislosti na vaší distribuci Linuxu může existovat instalační balíček připravený k použití. Všimněte si, že blockruntime nelze zkompilovat pouze pro Linux, lze jej zkompilovat také pro FreeBSD nebo Windows (MinGW/Mingw-w64) nebo dokonce pro Mac, pokud nechcete používat runtime, které poskytuje Apple. Teoreticky by měl být přenosný na jakoukoli platformu, která clang nativně podporuje.
Soudě podle toho, s jakými knihovnami se potřebujete propojit pro program clang používající bloky, se zdá, že neexistuje snadný způsob, jak to opravit, přinejmenším od začátku roku 2010.