¿Bloque Clang en Linux?

2 minutos de lectura

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.cObtuve

/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 -lBlocksRuntimepero luego tengo

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

¿Alguna pista?

  • ¿Instalaste la extensión correctamente? donde fue libBlocksRuntime.a y/o libBlocksRuntime.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

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?