3

iOS で関数を名前で呼び出すことはできませんか? というC関数がありgetstringます。私は次のように呼んでいます。

void* handle = dlopen(NULL, RTLD_NOW);
if (handle)
{
fp func = dlsym(handle, "getstring");
if (!func)
    responseField.text = [NSString stringWithUTF8String:dlerror()];
else {
    char* tmpStr = func();
    responseField.text = [NSString stringWithUTF8String:tmpStr];        
}
}
else {
responseField.text = [NSString stringWithUTF8String:dlerror()];
}

これが実行されると、responseFiled.textに設定されdlsym(...): symbol not foundます。これは、機能するdlopenが機能しないことを意味しdlsymます。バイナリを使用してシンボルをダンプし、存在するnmことを確認しました_getstringのマニュアルを確認したdlsymところ、名前にアンダースコアを追加してはいけないと書かれています。とにかく追加しても問題は解決しません。私は何を間違っていますか?

ここで、Objective-C で関数を名前で呼び出すことについて同様の質問をし、回答に従って Mac で正常に実行したため、この問題は iOS に固有のようです。

4

2 に答える 2

2

ライブラリを静的にリンクしても、iOS で dlopen がサポートされていないことが問題だと思います。あなたは使用できるはずです

dlsym(RTLD_SELF, "getstring");

RTLD_SELF は「dlsym を呼び出した画像を探し始める」ことを意味するためです。dlopen() の使用方法に基づいて、同じことを達成する必要があります。

于 2012-03-14T15:04:52.937 に答える
1

私も実際にあなたのようなケースで成功した経験があります。以前dlsym(RTLD_MAIN_ONLY, "getstring")は関数ポインタを取得していました。

getstringシンボルは動的リンクに適している必要があることに注意してください。これは、次を使用して確認できます。

nm -m <application>

あなたのシンボルはexternal(ではないnon-external)でなければなりません。

シンボルが としてマークされていることを確認する手順については、まだよくわかりませんexternal

于 2012-04-07T21:25:11.440 に答える