2011-03-06 22 views
1

我敢肯定的愚蠢的問題是一些不正確的語法。如何讓dlsym使用返回值的函數?我在下面的代碼中得到錯誤'無效轉換爲void *到LSError(*)()' - 試圖獲得編譯linux的lightscribe示例程序希望我可以將它與OSX dylib鏈接(爲什麼地獄「T HP發佈實際可可SDK LS纔出現了什麼6或7年了):???從dlsym()返回值的函數?

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); 
+1

我發現這個頁面http://www.trilithium.com/johan/2004/12/problem-with-dlsym/,似乎解決了這樣的問題,有必要將void *轉換爲函數指針。 Uugh .. – 2011-03-06 04:34:59

+0

我發現了一種工作。使用dlopen打開文件後,我有一組行: LSError(* LS_DiscPrinter_ReleaseExclusiveUse)(LS_DiscPrinterHandle); LS_DiscPrinter_ReleaseExclusiveUse =(LSError(*)(void *))dlsym(LSHandle,「LS_DiscPrinter_ReleaseExclusiveUse」); 這是相當笨拙。 xCode不喜歡在我發現的第二頁上使用typedef - 我不理解爲'extern「C」typedef XML_Parser parsercreate_t(const XML_Char *);'根本沒有提到XML_ParserStruct的返回類型。 – 2011-03-06 06:08:57

回答

3

C標準實際上並不轉換和從函數指針定義行爲。解釋因何而異;最常見的不是所有的體系結構都將函數指針作爲簡單的數據指針。在某些體系結構中,函數可能駐留在完全不同的內存段中,使用void指針無法尋址。

的「推薦使用dlsym 」方法是:

LSError (*LS_DiscPrinter_ReleaseExclusiveUse)(LS_DiscPrinterHandle); 

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

閱讀dlsym的POSIX頁面上的理由和例子以獲取更多信息。