私は同様の投稿をたくさん見ましたが、本のあらゆるトリックを試してみましたが、まだ苦労しています。すべてが正常に機能していましたが、一部のコンポーネント/セレクターを使用して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を使用します。
私は解決策を見つけました。 -ldlの前に-Wl、-no-as-neededを設定する新しいコンパイルコマンドは
gcc main.cpp -lsqlapi -lstdc ++ -Wl、-no-as-needed -ldl
どうやら、最近のバージョンのgcc/ldがデフォルトで--as-neededとリンクしていることに関係があるようです。