3

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

4

4 に答える 4

5

LLVM と CLang と GNUstep は、使用するのが難しいまたは複雑であるとは主張していないため、これは良い質問です。ただし、ユーザーにドキュメントを読む (および再読する) ように求めています。私自身、Ubuntu でこの組み合わせを発見したばかりで、非常に興味深いものです。そして、現時点では多くの可動部分があります。

OPがgnustepメーリングリストの1つで回答を得た場合、それがどのように解決されたかをここで聞いてうれしいです.

最初からやり直して、LLVM と GNUstep から最新のものだけを直接インストールするという通常のルートを提案することなく、ここに私の見解を示します。

OP は、gunstep/libobjc2 プロジェクトによって提供されるランタイムで ARC とブロックを使用しようとしています。

libobjc2 はおそらく、clang バージョン 3.2 でビルドする必要があります。または、おそらくツリーの最上位です。clang -v は、マシンにあるバージョンを教えてくれます。Ubuntu 12.10 でさえ clang-3.2 を提供していないことがわかりました。LLVM の Web サイトからダウンロードします。Ubuntu 12.04 LTS 用のビルド済みバイナリがあります。このビルド ステップで make に 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 インストール ステップでは設定されませんでした。

このライブラリを取得するには、環境変数 LD_LIBRARY_PATH に /usr/local/lib を追加する必要がありました。システムに他のバージョンがあるかどうかを確認するために、'locate libojbc.so' を試しても問題ありません。

最後に、libobjc2 の readme ( https://github.com/gnustep/gnustep-libobjc2#readme ) では、この新しいバージョンの gnustep ライブラリは 2 つの ABI をサポートし、各 ABI は ARC とブロックをサポートすると述べています。libobjc2 でコンパイルすることについて私が見たアドバイスは、コンパイルとリンクが期待されるランタイム バージョンも提供することです: -fobjc-runtime=gnustep. Ubuntu の Clang は、依然として古い ABI にデフォルト設定されています。-fobjc-nonfragile-abi は同じことを達成するかもしれませんが、フラグが廃止された、または廃止されると述べているのを見てきました。

OP エラーは、実際には、clang がコンパイルされた場所ではなく、a.out が実行されているステップから発生する可能性があります。おそらく、ダイナミック ローダーが従来の libobj.so を取得しています。繰り返しますが、locate を使用して、システムに複数のシステムがあるかどうかを確認します。

于 2013-03-11T15:14:44.640 に答える
1

これはかなり遅い答えですが、すべてを機能させる方法を見つけました(特にElementary OSで、Ubuntuや同様のディストリビューションで問題ないと思います)。

前述のように、プレフィックス、ビルド オプションなどを選択できるため、ソースからすべてをビルドする方が適切で簡単です。一般的な方法は次のとおりです。

  1. cmake をインストールします (まだインストールされていない場合) -->sudo apt-get install cmake
  2. こちらの手順に従って、llvm と clang をダウンロード、ビルド、およびインストールします(または、添付のビルド スクリプトを参照してください)。速度を上げるには、--enable-optimizedフラグを使用します。テストは「オプション」です;-)
  3. のデフォルトのビルド スクリプトにcompiler-rtは、Blocks ランタイムが含まれていません。ビルド スクリプトを変更するか、他の誰かが既にそれを行っていることを喜ぶことができます (特に、私のように、あなたの cmake が優れていない場合)。この git リポジトリlibBlocksRuntimeからダウンロード、ビルド、およびインストールします (基本的には、カスタム ビルド スクリプトを使用した最新の Blocks ランタイム コードのクローンです)。それらのコンパイルとテスト方法に従ってください。compiler-rt
  4. libobjc2GNUStep からダウンロード、ビルド、インストールします。正しいビルドの手順は、実際には非推奨の makefile 内にあります。
  5. 実行しますldconfig(必要な場合 - 実行していなくても実行しても問題はありません)。

LD_LIBRARY_PATH@WeakPointer として、新しいライブラリを取得するために環境変数を編集する必要がある場合があります。もう 1 つのオプションは、clang が新しいライブラリを見つけられるように、簡単で汚いシンボリック リンクを作成することです。

最後の注意: GNUStep の libobjc2 と GCC の libobjc を比較したことはありません。後者にはいくつかの Objective-C 2.0 機能が含まれています...システムに両方を同時に保持する場合は、ライブラリの選択に注意してください!


次のスクリプトはそれをすべて実行する必要があります (テストされていません!):

#!/bin/bash
# Temporary base directories
basedir="./clangllvm_temp"
basedir2="./libBlocksRuntime_temp"
basedir3="./libObjc2_temp"

# Clang, llvm, compiler-rt
mkdir $basedir
cd $basedir
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../..
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
cd ../../../..
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
cd ../..

mkdir build
cd build
../llvm/configure --prefix=$PREFIX --enable-optimized
make
sudo make install
cd ../..

# libBlocksRuntime
git clone https://github.com/mackyle/blocksruntime.git $basedir2
cd $basedir2
sudo ./buildlib
sudo ./checktests
sudo ./installlib
# Test!
clang -o sample -fblocks sample.c -lBlocksRuntime && ./sample
cd ..

# libobjc2
https://github.com/gnustep/gnustep-libobjc2.git $basedir3
cd $basedir3
mkdir Build
cd Build
cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
sudo make && sudo -E make install
cd ../..    

# Cleanup
rm -rf $basedir
rm -rf $basedir2
rm -rf $basedir3

# ldconfig
sudo ldconfig

# Additional symlink/LD_LIBRARY_PATH stuff here if required.

# EOF
于 2014-01-14T09:38:37.330 に答える
1

これは推測にすぎませんが、GNUstep はデフォルトで GCC を使用してビルドされるのではないかと推測してみます。最初のステップとして、Clang を使用するように GNUstep ビルドを再構成することをお勧めします。どのような問題が発生するかはわかりませんが...

または、Clang の代わりに GCC を使用してアプリケーションをビルドすることもできます。

于 2013-02-20T13:58:04.123 に答える
0

主な違いは、ビルドに Clang を使用したことです。システムのデフォルト コンパイラである GCC を使用しないように注意してください。この問題を回避するために、システムからパッケージを削除gobjcしました。g++

export CC=clang
export CXX=clang++

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

この回答は、このメーリング リスト スレッドからヒントを得たものです: http://lists.gnu.org/archive/html/discuss-gnustep/2012-12/msg00036.html

記述されたスクリプトはここに投稿されています: http://wiki.gnustep.org/index.php/GNUstep_under_Ubuntu_Linux

今では単純な ARC コードをコンパイルします。


GCC と Clang で生成されたコードは互換性がないようです。

アップデート

FreeBSD と CentOS でセットアップするためのスクリプトlibobjc2を書きました。

スクリプトは主にブログからコピーされます。

于 2013-02-21T00:15:11.447 に答える