En 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;
}
compilar:
clang test.c -fblocks -lBlocksRuntime -o test
./test
Hello, block!
funciona bien.
Antecedentes técnicos:
Los bloques en sí mismos son una función de idioma, pero también requieren algún soporte de tiempo de ejecución. Por lo tanto, el compilador debe proporcionar una biblioteca de tiempo de ejecución y vincularla estáticamente al producto de compilación o el sistema debe proporcionar una biblioteca de tiempo de ejecución de este tipo con la que se pueda vincular el producto de compilación.
En el caso de macOS, el tiempo de ejecución de bloques es parte de libSystem y como todas las bibliotecas ejecutables y dinámicas en macOS están vinculadas con libSystem, todas tienen soporte para bloques.
En un sistema Linux, dicho soporte de tiempo de ejecución normalmente se agregaría a la biblioteca libC (glibc en la mayoría de los casos) si se considerara una función central del sistema o del lenguaje, pero como gcc actualmente no tiene soporte para bloques y se desconoce si los bloques alguna vez se convertirán en una función oficial de C, los sistemas Linux no ofrecen soporte de tiempo de ejecución para bloques de forma predeterminada.
clang en sí mismo ofrece un tiempo de ejecución de bloques independientes del destino como parte de la biblioteca de tiempo de ejecución del compilador, sin embargo, es opcional y muchos sistemas Linux no parecen incluirlo en su paquete de instalación de clang. Es por eso que se ha creado el tiempo de ejecución de bloques del proyecto, que crea el soporte de tiempo de ejecución de bloques de clang como una biblioteca propia, que puede vincular estáticamente a sus proyectos o instalar dinámicamente en sus sistemas. El código fuente está disponible en GitHub.
Dependiendo de su distribución de Linux, puede existir un paquete de instalación listo para usar. Tenga en cuenta que blocksruntime no solo se puede compilar para Linux, también se puede compilar para FreeBSD o Windows (MinGW/Mingw-w64) o incluso para Mac si no desea utilizar el tiempo de ejecución que proporciona Apple. En teoría, debería ser portátil para cualquier plataforma compatible con clang de forma nativa.
A juzgar por qué bibliotecas necesita vincular para un programa clang que usa bloques, parece que no hay una manera fácil de solucionar esto, al menos a principios de 2010.