6

如何在 linux 上编译以下代码?使用 Ubuntu 10.10 (Maverick Meerkat)。

#include <stdio.h>
#include <stdlib.h>

int main() {
  无效 (^block)() = ^{
    printf("你好世界");
  };
  堵塞();
}

我试过了:

gcc -x 目标-c tc 

并得到:

tc:在函数'main'中:
tc:5: 错误:预期标识符或 '(' 在 '^' 标记之前

任何有关如何使这项工作的指导表示赞赏。根据反馈编辑问题,谢谢。

4

3 回答 3

10

官方的 GCC 不包括块支持。为此,您要么需要使用 Apple 的补丁程序,要么使用 clang,这是一个基于 LLVM 的编译器,具有良好的 Objective-C 支持(因为 Apple 一直在为其开发提供资金)。在 linux 上,最好不要尝试将 Apple 的补丁应用于 GCC。跟着叮当声就行了。

然而,仅仅拥有一个支持块的编译器是不够的——运行时还需要支持块。您可以在 linux 上与 GNUStep 一起使用两种运行时,还有一种用于 BSD(libdispatch 已移植到 FreeBSD,它需要具有块功能的运行时)。

在linux上获得objective-c支持的最快方法可能是安装最新的clang和GNUStep-base的最新快照以及来自GNUStep的ObjectiveC2框架。您的发行版不太可能有任何新的足以与最新的运行时和编译器一起工作的 GNUStep 相关软件包。

于 2011-01-10T09:40:10.880 回答
0

是的,这是简短的回答,但可能需要一些工作。

更长的答案是 Apple 使用开源编译器(GCC 和 LLVM),因此没有理由不能将它们移植到 Linux。我不知道是否有人真正做过这项工作。有点迂腐,块是在 C 级实现的。这意味着获取块相对容易,但您会错过许多使用它们的库。正如 robin 所说,UI 是主要的,但您可以移植GCD

于 2011-01-10T09:22:59.020 回答
0

(我讨厌我还不能发表评论,因为我的声誉不够高,所以这就是这个“答案”的原因)

@user57368 在第一段中是正确的,但是(基于原始问题)最后两段存在一些“问题”:

GCD(Apple 的“伟大”线程工具,称为 Grand Central Dispatcher)是使用提供“dispatch_*”功能的 libdispatch 的运行时线程。通过使用 blocks 结构,GCD 确实很好地利用了(并使代码“更好”)。但是GCD不需要块,因为 dispatch_* 函数调用有函数版本。

Blocks 是一种基于语言 lamdba 的结构,不依赖也不提供 GCD/libdispatch 功能。它们都是由 Apple 在 MacOSX/iOS/Xcode 世界中同时引入的,但它们并不相互依赖。

PS:我最近看到了 FreeBSD 的 libdispatch 实现,以及一些在 Linux 上实现选项的尝试。

于 2016-10-24T08:58:54.997 回答