5

メイン プログラムからエクスポートされた関数を呼び出したいdylib内部からを動的にロードするメイン アプリケーションがあります。メインアプリケーションdylibを取得dlopen(NULL,flag)し、. handledlsym(handle, symbol)function

dlopen与えますが、私no errorがしようとすると、次のようになります:dlsymfunctionerror

dlerror dlsym(RTLD_NEXT, CallMe): symbol not found

シンボルはnmによって確認されて修正されてエクスポートされます なぜそこにあるのかわからないのRTLD_NEXTですか? これはの結果dlopen(NULL,flag)ですか?

どうすればこの問題を解決したり、目標を達成したりできますか?

または、メインアプリケーションを呼び出す他の方法はありますか (関数ポインターを dylib に渡すことはできません)。

前もって感謝します!

追加した:

書き出す:

extern "C" {
    void CallMe(char* test);    
}
__attribute__((visibility("default")))
void CallMe(char* test)
{
    NSLog(@"CallMe with: %s",test);
}

nmの結果

...
0000000000001922 T _CallMe
..

dylib のコード:

void * m_Handle;
typedef void CallMe(char* test);
CallMe* m_Function;

m_Handle = dlopen(NULL,RTLD_LAZY); //Also tried RTLD_NOW|RTLD_GLOBAL

if(!m_Handle)
    return EC_ERROR;

m_Function = (CallMe*)dlsym(m_Handle, "CallMe");
if(!m_Function)
    return EC_ERROR;

m_Function("Hallo");
4

1 に答える 1

5

より良いアプローチは、動的ライブラリで独自のプロトコルを確立し、関数ポインタの構造体を渡して初期化することだと思います。動的ライブラリーは、単純にある種のinit(const struct *myfuncs)、またはそのような関数を提供する必要があり、これにより動的ライブラリーの実装がより簡単になります。

これにより、実装の移植性も向上します。

于 2011-11-15T13:04:34.713 に答える