Sur 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;
}
compiler :
clang test.c -fblocks -lBlocksRuntime -o test
./test
Hello, block!
fonctionne bien.
Informations techniques de base :
Les blocs eux-mêmes sont des fonctionnalités de langage, mais ils nécessitent également une prise en charge de l'exécution. Ainsi, soit le compilateur doit fournir une bibliothèque d'exécution et la lier statiquement au produit de construction, soit le système doit fournir une telle bibliothèque d'exécution à laquelle le produit de construction peut être lié.
Dans le cas de macOS, l'exécution des blocs fait partie de libSystem et comme toutes les bibliothèques exécutables et dynamiques sur macOS sont liées à libSystem, elles prennent toutes en charge les blocs.
Sur un système Linux, un tel support d'exécution serait généralement ajouté à la bibliothèque libC (glibc dans la plupart des cas) s'il était considéré comme une fonctionnalité essentielle du système ou du langage, mais comme gcc n'a actuellement aucun support pour les blocs et son inconnu si les blocs deviendront un jour une fonctionnalité C officielle, les systèmes Linux n'offrent pas de support d'exécution pour les blocs par défaut.
clang lui-même offre un runtime de blocs indépendant de la cible dans le cadre de la bibliothèque d'exécution du compilateur, mais il est facultatif et de nombreux systèmes Linux ne semblent pas l'inclure dans leur package d'installation clang. C'est pourquoi le projet blocksruntime a été créé, qui construit le support d'exécution des blocs clang en tant que bibliothèque propre, que vous pouvez lier statiquement à vos projets ou installer dynamiquement sur vos systèmes. Le code source est disponible sur GitHub.
Selon votre distribution Linux, un package d'installation prêt à l'emploi peut exister. Notez que blocksruntime ne peut pas seulement être compilé pour Linux, il peut également être compilé pour FreeBSD ou Windows (MinGW/Mingw-w64) ou même pour Mac si vous ne souhaitez pas utiliser le runtime fourni par Apple. Théoriquement, il devrait être portable sur n'importe quelle plate-forme prise en charge nativement par clang.
À en juger par quelles bibliothèques devez-vous lier pour un programme clang utilisant des blocs, il semble qu'il n'y ait pas de moyen facile de résoudre ce problème, du moins au début de 2010.