1. ホーム
  2. c++

[解決済み] GLIBCXX_3.4.21 がファイル libstdc++.so.6 でリンク時間参照で定義されていない

2022-02-17 04:52:37

質問

申し訳ありません。これとよく似た質問が比較的多く寄せられているようですが、どの解決策も私には効果がないようです。それなりに複雑なc++のコードを実行しようとすると、上記のエラーが発生します。エラーメッセージの全文は以下の通りです。

/main: relocation error: ./main: symbol _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference

を実行すると、非常によく似たエラーが発生します。

./main: relocation error: ./main: symbol _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference

これらのプロジェクトは両方ともうまくコンパイルできるので、実はコンパイルには何の問題もありません。これは、実行ファイルを実行しようとしたときに起こるだけです。 gccのインストールにエラーがあると思ったので、今日、再インストールしましたが、全く役に立ちませんでした。この問題を解決するために何をしたらいいのか本当にわかりません。誰か手助けしてくれませんか?

これは、私があるプロジェクトをコンパイルするために使用しているMakefileです、私はこれがエラーの可能性がある場所であると感じています。

CC= g++
CFLAGS= -Wall -g -std=c++11 -lX11 -lpthread
OBJS = main.o Board_Tile.o Sliding_Solver.o

main: $(OBJS)
   $(CC) -o $@ $(OBJS)
%.o : %.cc
   $(CC) $(CFLAGS) -c $^

gccのバージョンは5.3.0、Ubuntu 14.0.4を使っています。

解決方法は?

GCC 5.1または5.2(今思い出せないのでググってください)は、C++のABIを変更しました。標準のubuntuは(libstdc++を含む)古いABIでコンパイルされています。

gccコンパイラは新しいABIを使おうとします。うまくいくこともあれば、うまくいかないこともあります。

つまり、コードをコンパイルする方法は3つあります。

1) gccをダウングレードする

2) -D_GLIBCXX_USE_CXX11_ABI=0 (cmake の例) フラグを追加する (この方法を取る場合、次のステップに進むまでビルドするすべての makefile またはプロジェクトにこのフラグを追加する必要があります) ubuntuをアップグレードするか、gccをダウングレードしてください)

3) Ubuntuのアップグレード (テストしました。ちなみに16.04はデフォルトで新しいABIと新しいgccが適用されるので、すべてのペットプロジェクトからack-grepして上記のフラグを削除する必要がありました)

もあります。 GCC 5の_GLIBCXX_USE_CXX11_ABIと新しいABIを理解する。

P.S. 面白いことに、答えは質問の中にあるんだ。 _ZNSt7__cxx11 : CXX11 とはいえ、私たちはエラーメッセージを読むことはあまりありません。