0

私は持っているプログラム構造を持っています

静的ライブラリ(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.、それでもこのシンボルが見つかりません。何か案が?

4

1 に答える 1

0

そこにありますが、プラグインはそれを見つけることができません!

いいえ、シンボルはありませ

むしろ、シンボルには内部リンケージ ( t) があり、リンク先の ELF イメージの外部では表示または使用できません。グローバルに表示されるシンボルには、外部 ( T) リンケージがあります。

シンボルがリンケージを持つ最も可能性の高い原因は、シンボルがソース レベルでtリンケージを持つことです。__attribute__((visibility("hidden")))ドキュメンテーションはこちら

なぜ ACE 開発者がそのようにマークしたのか、私にはわかりません。

于 2012-07-07T14:43:04.860 に答える