2

関数を含むファイルがありますvoid initGui()。それは何かをします。.soそのファイルで作成された共有ライブラリもあります。

dlsym(..., "initGui")問題は、を起動しようとするとdlerror()、シンボルが見つからなかったと表示されることです(もちろん、以前はシンボルdlopenを開いていました)。だから私はnm自分の共有ライブラリを試してみました。_Z7initGuiiii私はそれが私が探しているものかもしれないことを「理解」しました。だから私はそれを試みましdlsymた...そしてそれはうまくいきました。

誰かが私の共有オブジェクトライブラリにクリーンなシンボルを含める方法を教えてもらえますか?

でコンパイルしg++ -Wall -Wextra -Werror -c -fPICます。

4

1 に答える 1

3

dlsymC ++でコーディングされたいくつかの-ed共有ライブラリ内で-ingする場合の通常の方法dlopenは、それらのシークされたシンボル(dlsym-ingしているシンボル)が宣言されるという規則を持つことですextern "C"。次に、それらの名前は。で簡単に表示できますdlsym。だからあなたは宣言する必要があります

 extern "C" void initGui(void);

そしてする

 typedef void initguiroutine_sig_t(void);
 initguiroutine_sig_t* initguiptr = dlsym(dlhandle,"initGui");
 if (!initguiptr) { 
    fprintf(stderr, "initGui not found: %s\n", dlerror());
    exit (EXIT_FAILURE);
 };
 // later, call initguiptr like
 (*initguiptr) ();

C ++の名前マングリングがどのように機能するかを詳細に理解することはお勧めしません。詳細はあまり明確に定義されておらず、詳細はC ++ライブラリの特定のバージョン(特に標準C ++ライブラリ)とコンパイラのバージョンによって異なります。

于 2013-03-20T19:30:12.107 に答える