私は持っているプログラム構造を持っています
静的ライブラリ(ACE)
静的ライブラリ (common.a)
動的ライブラリ プラグイン 1(1.so)
プラグイン 2(2.so) および実行可能ファイル
plugin1, plugin2 and executable
すべてが両方common.a
を使用し、libACE.a
こちらのチュートリアルに従ってください: http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html .
以下に示すように、実行可能ファイルをコンパイルするときに、これら 2 つの静的ライブラリのみをリンクします。
g++ -g -DUNIX -DLINUX -Wall -D__NUMBER_FIELD_ID__ -I/opt/ACE_wrappers -Ilib/ -I. -I./common -I./common/lib -I../inc -I/opt/pct/pctlib/inc -o acs_d acs_d.o -L../lib -Wl,--export-dynamic -rdynamic -Wl,--whole-archive /opt/ACE_wrappers/ace/libACE.a common/libcommon_d.a -Wl,--no-whole-archive -ldl -lrt -lpthread
ポイントは、dlopen を使用してこれら 2 つのプラグインを開くと、1 つが成功し、1 つが失敗することです。
[CModuleMgr] loadCModule(): Errors occurred when opening the module. nCModuleId[1] pLibHandle[(nil)] sCModulePath[/opt/acs/adapter/libadapter_d.so] sError[/opt/acs/adapter/libadapter_d.so: undefined symbol: _ZN17ACE_Event_Handler10set_handleEi]
メインプログラムでは、コマンド nm を使用してシンボルを見つけようとしました
$ nm acs_d | grep _ZN17ACE_Event_Handler10set_handleEi
000000000048f240 t _ZN17ACE_Event_Handler10set_handleEi
そこにありますが、プラグインはそれを見つけることができません! 次のようなオプションを使用 しましたが-Wl,--export-dynamic -rdynamic -Wl,--whole-archive.
、それでもこのシンボルが見つかりません。何か案が?