Clang tiene una extensión genial llamada cuadra trayendo el verdadero mecanismo de la función lambda a C. En comparación con el bloque, las funciones anidadas de gcc son bastante limitadas. Sin embargo, intentar compilar un programa trivial c.c
:
#include <stdio.h> int main() { void (^hello)(void) = ^(void) { printf("Hello, block!\n"); }; hello(); return 0; }
con clang -fblocks c.c
Obtuve
/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 debería usar clang -fblocks c.c -lBlocksRuntime
pero luego tengo
/usr/bin/ld.gold: error: cannot find -lBlocksRuntime (the rest is the same as above)
¿Alguna pista?
En UbuntuLinux:
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.
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
¿Instalaste la extensión correctamente? donde fue
libBlocksRuntime.a
y/olibBlocksRuntime.so
¿terminar? ¿Está ese directorio en la ruta de búsqueda de la biblioteca de enlaces predeterminada? ¿Necesitas usar un-L
argumento para agregar el directorio a la ruta de búsqueda?– Mecánica cuántica
6 de mayo de 2011 a las 5:30
@QuantumMechanic Instalé clang del repositorio de Arch Linux.
-fblocks
funciona, así que creo que la compilació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
6 de mayo de 2011 a las 5:33
sudo apt-get install libblocksruntime-dev
en Ubuntu funciona bien, estoy usando bloques en el código basado en C de producción en Ubuntu.– Mirek Rusin
19 de junio de 2012 a las 8:45
Como truco, agregue un bloque de memoria llamado
_NSConcreteGlobalBlock
. tio.run/…– jxh
6 de febrero de 2019 a las 0:13