web-dev-qa-db-ja.com

「dlsym」への未定義の参照

私は同様の投稿をたくさん見ましたが、本のあらゆるトリックを試してみましたが、まだ苦労しています。すべてが正常に機能していましたが、一部のコンポーネント/セレクターを使用してwiresharkをインストール/削除した後、すべてが台無しになりました。どのライブラリ/パッケージがアンインストールされたか正確には覚えていませんが、おそらく私が気づいたよりもはるかに多くです。

このような単純なmain.cppファイルを作成した場合:

#include <SQLAPI.h>
int main()
{
  SAConnection con;
  return 0;
}

そして試してみる

g ++ main.cpp -lsqlapi -ldl

次のエラーメッセージが表示されます。

/usr/local/lib/libsqlapi.so: undefined reference to `dlsym'
/usr/local/lib/libsqlapi.so: undefined reference to `dlerror'
/usr/local/lib/libsqlapi.so: undefined reference to `dlopen'
/usr/local/lib/libsqlapi.so: undefined reference to `dlclose'
collect2: error: ld returned 1 exit status

順序が重要であると示唆する人もいるので、-lsqlapiの前に-ldlを配置しようとしました。 g ++の代わりにgccを使用すると、エラーは次のようになります。

/usr/bin/ld: /tmp/ccwBI4tj.o: undefined reference to symbol '__gxx_personality_v0@@CXXABI_1.3'
/usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

SAConnectionが削除された場合、ファイルをコンパイルして実行できます。

Libboostでも同様の問題が発生するため、SQLAPIとは関係ないと思います。小さなコード例はありませんが、先週正常にコンパイルされたプロジェクトをコンパイルすると、エラーが発生します。

/usr/bin/ld: debug/components/helloworld/HelloWorld.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.53.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

このプロジェクトは変更されていないMakefileを使用しているため、システム上で正しくないものでなければなりません。 build-essentialを再インストールしようとしました。

Ubuntu 64ビット13.10とg ++バージョン4.8.1を使用します。

19
evinje

私は解決策を見つけました。 -ldlの前に-Wl、-no-as-neededを設定する新しいコンパイルコマンドは

gcc main.cpp -lsqlapi -lstdc ++ -Wl、-no-as-needed -ldl

どうやら、最近のバージョンのgcc/ldがデフォルトで--as-neededとリンクしていることに関係があるようです。

43
evinje