1

私が確信している愚かな質問は、正しくない構文です。値を返す関数で dlsym を動作させるにはどうすればよいですか? 次のコードで「無効な void* から LSError (*)() への変換」というエラーが表示されます。Linux の lightscribe サンプル プログラムをコンパイルして、OSX の dylib にリンクできることを期待しています (なぜ勝ったのか)。 'HP は実際の Cocoa SDK をリリースしていませんか? LS が登場してからわずか 6 年か 7 年ですか?):

void* LSHandle = dlopen("liblightscribe.1.dylib", RTLD_LOCAL|RTLD_LAZY);
    if (LSHandle) {
        LSError (*LS_DiscPrinter_ReleaseExclusiveUse)() = dlsym(LSHandle, "LS_DiscPrinter_ReleaseExclusiveUse");

..
lsError = LS_DiscPrinter_ReleaseExclusiveUse( pDiscPrinter);
4

1 に答える 1

3

C 標準では、関数ポインターとの間の変換の動作は実際には定義されていません。理由についてはさまざまな説明があります。最も一般的なのは、すべてのアーキテクチャが関数ポインターをデータへの単純なポインターとして実装しているわけではないということです。一部のアーキテクチャでは、void へのポインタを使用してアドレス指定できない、まったく異なるメモリ セグメントに関数が存在する場合があります。

「推奨される」使用方法dlsymは次のとおりです。

 LSError (*LS_DiscPrinter_ReleaseExclusiveUse)(LS_DiscPrinterHandle);

 *(void **)&LS_DiscPrinter_ReleaseExclusiveUse = dlsym("LS_DiscPrinter_ReleaseExclusiveUse");

詳細については、POSIX ページの根拠と例を参照しdlsymてください。

于 2011-03-06T20:43:00.520 に答える