我下载并构建了 GNUstep libobjc2 1.6.1,

svn co http://svn.gna.org/svn/gnustep/libs/libobjc2/1.6.1/ rep
cd rep
make

当我尝试编译 Objective-C 代码时出现此错误。
hoon@ubuntu:~/work/objc2$ clang -fobjc-nonfragile-abi -fobjc-arc -fblocks *.m *.a -l pthread; ./a.out
Objective-C ABI Error: Loading modules from incompatible ABIs while loading
a.out: loader.c:38: __objc_exec_class: Assertion `objc_check_abi_version(module)' failed.
Aborted (core dumped)

看来我需要用一些不同的配置来构建 libobjc.a。有什么问题,我应该怎么做才能解决这个错误?

环境:Ubuntu 12.04 LTS

最佳答案

这是一个很好的问题,因为 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 预构建了二进制文件。为了让 make 在这个构建步骤中使用 clang,我已经看到了设置和导出 CC=clang 和 CXX=clang++ 的说明。

构建 libobjc2 后,必须注意安装它的位置。如果系统已经有一个较旧的 libobjc.so.x.y 库(这为 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。尝试“定位 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 来查看系统是否有多个。

关于objective-c - 如何使 GNUstep libobjc2 工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14980402/

10-11 07:31