这是一个很好的问题,因为 LLVM 和 CLang 和 GNUstep 并不声称使用起来很难或复杂。他们确实要求他们的用户阅读(并重新阅读)他们的文档。我自己刚刚为 Ubuntu 发现了这种组合,它非常有趣。目前有很多活动部件。
如果 OP 在其中一个 gnustep 邮件列表上得到了答案,那么很高兴在这里听到它是如何解决的。
没有建议重新开始的正常路线,只直接从 LLVM 和 GNUstep 安装最新版本,这是我的看法。
OP 正在尝试将 ARC 和块与 gunstep/libobjc2 项目提供的运行时一起使用。
libobjc2 可能应该使用 clang 版本 3.2 构建 - 或者可能是树的顶部。clang -v 会告诉你你的机器上有什么版本。我发现即使 Ubuntu 12.10 也不提供 clang-3.2。所以我从 LLVM 网站下载它。他们为 Ubuntu 12.04 LTS 预构建了二进制文件。为了在这个构建步骤中使用 clang,我看到了设置和导出 CC=clang 和 CXX=clang++ 的说明。
一旦构建了 libobjc2,就必须注意它的安装位置。如果系统已经有一个较旧的 libobjc.so.xy 库(它为 Obj-C 提供运行时环境),那么当您开始编译自己的源代码时,clang 或链接器可能会选择错误的库。当我运行 make install 步骤时,我发现从 libobjc2 源构建的 libobjc.so.4.6.0 在 Ubuntu 12.04 和 12.10 上都安装到了 /usr/local/lib 中。此路径不是由 libobjc2 安装步骤设置的。
为了获取这个库,我必须将 /usr/local/lib 添加到环境变量 LD_LIBRARY_PATH。尝试 'locate libojbc.so' 看看系统上是否有其他版本不会有什么坏处。
最后,libobjc2 自述文件https://github.com/gnustep/gnustep-libobjc2#readme说这个新版本的 gnustep 库支持两个 ABI,每个 ABI 都支持 ARC 和块。我看到的关于使用 libobjc2 进行编译的建议是还提供预期要编译和链接的运行时版本:-fobjc-runtime=gnustep。Ubuntu 上的 Clang 仍然默认使用旧的 ABI。-fobjc-nonfragile-abi 可能会完成同样的事情,但我已经看到它提到该标志已经或将被弃用。
OP 错误实际上可能来自运行 a.out 的步骤,而不是编译 clang 的位置。也许动态加载器正在拾取遗留的 libobj.so。同样,我会使用 locate 来查看系统是否有多个。