Unter 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;
}
kompilieren:
clang test.c -fblocks -lBlocksRuntime -o test
./test
Hello, block!
funktioniert gut.
Technische Hintergrundinformationen:
Blöcke selbst sind Sprachfeatures, benötigen aber auch etwas Laufzeitunterstützung. Also muss entweder der Compiler eine Laufzeitbibliothek bereitstellen und diese statisch in das Build-Produkt einbinden oder das System muss eine solche Laufzeitbibliothek bereitstellen, mit der das Build-Produkt verknüpft werden kann.
Im Fall von macOS ist die Laufzeit der Blöcke Teil von libSystem und da alle ausführbaren und dynamischen Bibliotheken auf macOS mit libSystem verknüpft sind, unterstützen sie alle Blöcke.
Auf einem Linux-System würde eine solche Laufzeitunterstützung normalerweise zur libC-Bibliothek (in den meisten Fällen glibc) hinzugefügt, wenn sie als Kernfunktion des Systems oder der Sprache angesehen würde, da gcc jedoch derzeit überhaupt keine Unterstützung für Blöcke hat und es unbekannt ist, ob Blöcke jemals ein offizielles C-Feature werden, liefern Linux-Systeme standardmäßig keine Laufzeitunterstützung für Blöcke aus.
clang selbst bietet eine zielunabhängige Blocklaufzeit als Teil der Compiler-Laufzeitbibliothek, sie ist jedoch optional und viele Linux-Systeme scheinen sie nicht in ihr clang-Installationspaket aufzunehmen. Aus diesem Grund wurde das Projekt blocksruntime erstellt, das die Laufzeitunterstützung von clang blocks als eigene Bibliothek aufbaut, die Sie statisch in Ihre Projekte einbinden oder dynamisch auf Ihren Systemen installieren können. Der Quellcode ist auf GitHub verfügbar.
Abhängig von Ihrer Linux-Distribution kann ein gebrauchsfertiges Installationspaket vorhanden sein. Beachten Sie, dass blocksruntime nicht nur für Linux kompiliert werden kann, sondern auch für FreeBSD oder Windows (MinGW/Mingw-w64) oder sogar für Mac, wenn Sie die von Apple bereitgestellte Laufzeit nicht verwenden möchten. Theoretisch sollte es auf jede Plattform portierbar sein, die clang nativ unterstützt.
Nach Welche Bibliotheken müssen Sie für ein Clang-Programm mit Blöcken verlinken, scheint es keine einfache Möglichkeit zu geben, dies zu beheben, zumindest seit Anfang 2010.