Linux 构建中的 Clang 块失败?

问题描述 投票:0回答:3

Clang 有一个非常酷的扩展,名为 block,为 C 带来了真正的 lambda 函数机制。与 block 相比,gcc 的嵌套函数相当有限。但是,尝试编译一个简单的程序

c.c

#include <stdio.h>;

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

clang -fblocks c.c
,我得到了

/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)

似乎我应该使用

clang -fblocks c.c -lBlocksRuntime
,但后来我得到了

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

有什么提示吗?

c linux block clang
3个回答
28
投票

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

编译:

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

Hello, block!

工作正常。


4
投票

技术背景信息:

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

对于 macOS,块运行时是 libSystem 的一部分,并且由于 macOS 上的所有可执行文件和动态库都链接到 libSystem,因此它们都具有块支持。

在 Linux 系统上,如果这种运行时支持被认为是系统或语言的核心功能,通常会添加到 libC 库(大多数情况下为 glibc),但 gcc 目前根本不支持块且未知如果块将成为官方 C 功能,Linux 系统默认情况下不提供对块的运行时支持。

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

根据您的 Linux 发行版,可能存在即用型安装程序包。请注意,blocksruntime 不仅可以为 Linux 编译,还可以为 FreeBSD 或 Windows (MinGW/Mingw-w64) 编译,如果您不想使用 Apple 提供的运行时,甚至可以为 Mac 编译。理论上它应该可以移植到 clang 原生支持的任何平台。


1
投票

使用块的 clang 程序需要链接哪些库来看,似乎没有简单的方法可以解决这个问题,至少从 2010 年初开始是这样。

© www.soinside.com 2019 - 2024. All rights reserved.