C Linux中的叮当声块?
Clang有一个非常酷的扩展名为将lambda函数机制引入C。与block相比,gcc的嵌套函数非常有限。然而,试图编译一个简单的程序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
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的生产代码中使用了块。作为黑客,添加一个名为的内存块。