G ++を使用した共有ライブラリの未定義のシンボル
質問
JVMTIでは、Javaアプリケーションをプロファイルするエージェントを開発しています。したがって、共有ライブラリLibagent.SOがコンパイルされています。さらに、QTフレームワークを使用します。
今のところ、これら2つのソースファイルのみで構成されています。agent.cpp と agentserver.cpp
ただし、共有ライブラリLibagent.soでJavaアプリケーションを開始すると、エラーが発生します。 未定義のシンボル:_ztv11agentserver(./libagent.so)
LDDを実行すると、同じ依存関係の問題が発生します。
ldd -d libagent.so
linux-vdso.so.1 => (0x00007fffeb333000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f8b6731b000)
libm.so.6 => /lib/libm.so.6 (0x00007f8b67098000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f8b66e81000)
libc.so.6 => /lib/libc.so.6 (0x00007f8b66afe000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8b67844000)
undefined symbol: _ZTV11AgentServer (./libagent.so)
現在のコンパイルコマンドは次のとおりです。
g++ $(CXXFLAGS) -fPIC -shared -o libagent.so $(INCPATH) ../src/agent.cpp ../src/agentserver.cpp
ここで、$(cxxflags)は-m64 -pipe -o2 -wall -w -d_reentrant $(定義)です
ここで$(定義)は-dqt_no_debug -dqt_gui_lib -dqt_network_lib -dqt_core_lib -dqt_shared
ここで、$(incather)は-i/home/konrad/qtsdk -2010.05/qt/mkspecs/linux -g ++ -64 -i ../ src -i/home/konrad/qtsdk -20105/qt/include/qtcore -i i /home/konrad/qtsdk-2010.05/qt/include/qtnetwork -i/home/konrad/qtsdk-20105/qt/qtgui -i/home/home/konrad/qtsdk -2010.05/qt/qunting -i/usr/lib /jvm/java-6-openjdk/include -i/usr/lib/jvm/java-6-openjdk/include/linux -i。 -私。 -i ../ src -i。
私はこの問題を調査するためにしばらく時間を費やしましたが、このエラーを解決した人はいませんでした。
これは、agentserver.cppのヘッダーコードです。 agentserver.h
解決
エラーメッセージは、エージェントサーバーのvtableの要素が未定義であることを伝えています。の用法 Q_OBJECT
実行する必要があります moc
ソースに - QTライブラリへのリンク。