gpt4 book ai didi

objective-c - 如何让 GNUstep libobjc2 工作?

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:56 24 4
gpt4 key购买 nike

我下载并构建了 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 和 block 与 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 和 block 。我看到的关于使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com