2011-05-06 22 views
6

Clang tiene una extensión muy genial llamada block que lleva el verdadero mecanismo de función lambda a C. Comparado con el bloque, las funciones anidadas de gcc son bastante limitadas. Sin embargo, tratando de compilar un programa trivial c.c:Clang bloque en Linux?

 
#include <stdio.h> 

int main() { 
    void (^hello)(void) = ^(void) { 
     printf("Hello, block!\n"); 
    }; 
    hello(); 
    return 0; 
} 

con clang -fblocks c.c, llegué

 
/usr/bin/ld.gold: /tmp/cc-NZ7tqa.o: in function __block_literal_global:c.c(.rodata+0x10): error: undefined reference to '_NSConcreteGlobalBlock' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

parece que debo usar clang -fblocks c.c -lBlocksRuntime, pero luego me

 
/usr/bin/ld.gold: error: cannot find -lBlocksRuntime 
(the rest is the same as above) 

¿Alguna pista?

+0

¿Ha instalado la extensión correctamente? ¿Dónde terminaron 'libBlocksRuntime.a' y/o' libBlocksRuntime.so'? ¿Ese directorio está en la ruta de búsqueda de la biblioteca de enlaces predeterminada? ¿Necesita usar un argumento '-L' para agregar el directorio a la ruta de búsqueda? – QuantumMechanic

+0

@QuantumMechanic Instalé clang del repositorio de Arch Linux. '-fblocks' funciona, así que creo que la construcción de clang de Arch tiene la extensión. Hice una búsqueda de '* BlocksRuntime *' en '/ usr/lib' y no encontré ninguno. ¿Alguna pista sobre dónde se encuentran generalmente estas bibliotecas? – xiaq

+0

'sudo apt-get install libblocksruntime-dev' en Ubuntu funciona bien, estoy usando bloques en código de producción C en Ubuntu. –

Respuesta

17

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; 
} 

compilación :

clang test.c -fblocks -lBlocksRuntime -o test 
./test 

Hello, block! 

funciona bien.