【问题标题】:Are Objective-C blocks supported by compilers on Linux?Linux 上的编译器是否支持 Objective-C 块?
【发布时间】:2011-01-10 08:16:54
【问题描述】:

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

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

我试过了:

gcc -x 目标-c t.c

得到:

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

感谢任何有关如何完成这项工作的指导。根据反馈编辑问题,谢谢。

【问题讨论】:

  • 你试过了吗?这可能会回答你的问题....
  • Linux下没有编译Objective-C代码的“the”工具,所以他可能尝试过失败了,现在寻找另一个工具。
  • 对不起,我确实尝试编译。我更新了问题以获取更多详细信息。我进行了谷歌搜索并阅读了有关不被主线 gcc 接受的块。我找不到足够的信息来获取发布的简单代码以进行编译。

标签: objective-c linux objective-c-blocks


【解决方案1】:

官方 GCC 不包括块支持。为此,您要么需要使用 Apple 的补丁,要么使用 clang,这是一个基于 LLVM 的编译器,具有良好的 Objective-C 支持(因为 Apple 一直在资助它的开发)。在 linux 上,最好不要尝试将 Apple 的补丁应用于 GCC。随声去吧。

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

在 linux 上通过块获得 Objective-c 支持的最快方法可能是安装最新的 clang 和 GNUStep-base 的最新快照以及来自 GNUStep 的 ObjectiveC2 框架。您的发行版不太可能有任何新的足以与最新的运行时和编译器配合使用的 GNUStep 相关包。

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】: