如何使GNUstep libobjc2工作?

Eon*_*nil 3 ubuntu runtime objective-c gnustep libobjc2

我下载并构建了GNUstep libobjc2 1.6.1,

svn co http://svn.gna.org/svn/gnustep/libs/libobjc2/1.6.1/ rep
cd rep
make
Run Code Online (Sandbox Code Playgroud)

当我尝试编译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)
Run Code Online (Sandbox Code Playgroud)

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

环境:Ubuntu 12.04 LTS

Wea*_*ter 5

这是一个很好的问题,因为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.xy库(这为Obj-C提供了运行时环境),那么当您开始编译自己的源时,clang或链接器可能会选错了.我发现从libobjc2源构建的libobjc.so.4.6.0在我运行make install步骤时在Ubuntu 12.04和12.10上安装到/ usr/local/lib.libobjc2安装步骤未设置此路径.

为了获得这个库,我必须将/ usr/local/lib添加到env变量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来查看系统是否有多个.

  • 这真是难过;这真是伤心。6 年后,Ubuntu 18.04 LTS 发布了,而 libobjc2 _still_ 不在 Ubuntu 存储库中!“从源代码编译”显然仍然是获取 libobjc2 的唯一方法。我感觉我刚从时光机里走出来,现在是 1993 年。 (2认同)