C Linux中的叮当声块?

C Linux中的叮当声块?,c,linux,block,clang,C,Linux,Block,Clang,Clang有一个非常酷的扩展名为将lambda函数机制引入C。与block相比,gcc的嵌套函数非常有限。然而,试图编译一个简单的程序c.c: #include <stdio.h> int main() { void (^hello)(void) = ^(void) { printf("Hello, block!\n"); }; hello(); return 0; } #include <stdio.h> int ma

Clang有一个非常酷的扩展名为将lambda函数机制引入C。与block相比,gcc的嵌套函数非常有限。然而,试图编译一个简单的程序
c.c

#include <stdio.h> int main() { void (^hello)(void) = ^(void) { printf("Hello, block!\n"); }; hello(); return 0; }
#include <stdio.h>

int main() {
    void (^hello)(void) = ^(void) {
        printf("Hello, block!\n");
    };
    hello();
    return 0;
}
似乎我应该使用
铿锵-fblocks c.c-lBlocksRuntime
,但后来我

/usr/bin/ld.gold: error: cannot find -lBlocksRuntime (the rest is the same as above) /usr/bin/ld.gold:错误:找不到-lBlocksRuntime (其余同上) 有什么提示吗?

至少从2010年初的情况来看,似乎没有简单的方法可以解决这个问题。

在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; }
#include <stdio.h>

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

工作正常。

技术背景信息:

块本身是语言特性,但它们也需要一些运行时支持。因此,要么编译器必须提供运行时库并将其静态链接到构建产品,要么系统必须提供构建产品可以链接的运行时库

对于macOS,blocks运行时是libSystem的一部分,因为macOS上的所有可执行库和动态库都是针对libSystem链接的,所以它们都有blocks支持

在Linux系统上,如果libC库(在大多数情况下是glibc)被视为系统或语言的核心功能,则通常会添加此类运行时支持,但由于gcc目前根本不支持块,其未知的块是否会成为正式的C功能,默认情况下,Linux系统不提供对块的运行时支持

clang本身确实提供了一个目标独立块运行时作为其一部分,但它是可选的,许多Linux系统似乎并没有包含在他们的clang安装包中。这就是创建该项目的原因,该项目将clang blocks运行时支持构建为一个自己的库,您可以静态链接到项目中或动态安装到系统中。在GitHub上提供


根据您的Linux发行版,可能存在一个随时可用的安装程序包。请注意,blocksruntime不能只针对Linux进行编译,它也可以针对FreeBSD或Windows(MinGW/MinGW-w64)进行编译,如果您不想使用苹果提供的运行时,甚至可以针对Mac进行编译。从理论上讲,它应该可以移植到clang本机支持的任何平台。

您是否正确安装了扩展?
libBlocksRuntime.a
和/或
libBlocksRuntime.so
最后在哪里结束?该目录是否在默认链接库搜索路径中?是否需要使用
-L
参数将目录添加到搜索路径?@quantumi从Arch Linux的repo安装了clang<代码>-fblocks有效,因此我相信Arch的clang构建具有扩展性。我在
/usr/lib
中搜索了
*BlocksRuntime*
,但没有找到。有没有关于这些库通常位于何处的提示?
sudo apt get install libblocksruntime dev
在Ubuntu上运行得很好,我在Ubuntu下的基于C的生产代码中使用了块。作为黑客,添加一个名为
的内存块。