GCCとldはエクスポートされたシンボルを見つけることができません…しかしそれらはそこにあります
-
03-07-2019 - |
質問
C ++ライブラリと、ライブラリからエクスポートされた関数とクラスを使用しようとするC ++アプリケーションがあります。ライブラリは正常にビルドされ、アプリケーションはコンパイルされますが、リンクに失敗します。表示されるエラーは次の形式に従います:
app-source-file.cpp :(。text + 0x2fdb): `lib-namespace :: GetStatusStr(int) 'への未定義の参照
ライブラリ内のクラスはリンカによって問題なく解決されるようですが、フリー関数とエクスポートされたデータ(コサインルックアップテーブルなど)は常に上記のエラーを引き起こします。
Ubuntu 8.04(Hardy)を使用していますが、最新のUbuntuパッケージで最新です。
ライブラリをリンクするコマンドは次のとおりです(他のライブラリは削除されています):
g++ -fPIC -Wall -O3 -shared -Wl,-soname,lib-in-question.so -o ~/project/lib/release/lib-in-question.so
アプリケーションをリンクするコマンドは次のとおりです(他のライブラリは削除されています):
g++ -fPIC -Wall -O3 -L~/project/lib/release -llib-in-question -o ~/project/release/app-in-question
最後に、問題のシンボルが適切にエクスポートされているように見えます(私が知る限り):
nm -D ~/project/lib/release/lib-in-question.so | grep GetStatusStr --> U _ZN3lib-namespace12GetStatusStrEi
解決
nm出力の_ZN3lib-namespace12GetStatusStrEiの前のUは、ライブラリ内でシンボルが undefined であることを示しています。
間違った名前空間で定義されている可能性があります。lib-namepaceで呼び出しているように見えますが、別の名前空間で定義している可能性があります。
他のヒント
しばらく経ちましたが、-lオプションでlibを指定した場合、libプレフィックスをスキップしませんか?
(名前を" lib-in-question.so"から" libfoobar.so"に変更し、以下の例を読みやすくしました)
g++ -fPIC -Wall -O3 -L~/project/lib/release -lfoobar
または
g++ -fPIC -Wall -O3 ~/project/lib/release/libfoobar.so