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
这是一个很好的问题,因为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来查看系统是否有多个.
| 归档时间: |
|
| 查看次数: |
3609 次 |
| 最近记录: |