2012-01-17 43 views
0

我已經編譯了一個庫,我已經用MinGW創建了一個使用Borland 6的現有應用程序(我知道它的舊版本,但它就是這樣做的)。我用implib來創建.lib文件並將其導入到我的項目中。我也添加了路徑到dll和必要的頭文件。從一個不同的編譯器導入一個DLL

當我嘗試編譯時,我得到一堆未解決的外部類型錯誤。我錯過了導入過程的任何步驟嗎?假設我沒有,這個問題就像名字mangling一樣,我該如何去寫這個接口,這樣一來名字的改變就沒有關係了。我知道這涉及到extern C,但那是關於我的知識極限的。只有兩個類需要從dll外部訪問,其餘部分僅在內部使用。我不知道如何用完全由類構建的東西來使用extern C.我stil希望它是我與borland 6的導入。

+0

關於您的問題,有一個很好的常見問題(帶有代碼示例)。請注意,它主要關注Linux。但我希望它能幫助你http://www.faqs.org/docs/Linux-mini/C++-dlopen.html – 2012-01-17 14:00:34

回答

0

extern「C」不能用於類,只能用於免費函數。所以你可以選擇爲你的類寫一個「C」接口,每個函數接受一個指向你的類的指針,你可能會創建和銷燬函數。

這是一種典型的做法,你的類可以被正向聲明爲struct,它與class相同,然後甚至可以被用C語言編寫的應用程序使用。你通常會把extern「C」只有當__cplusplus被定義時,通常會有#ifdef保護。

還有另外一個選擇,如果你只想讓你的類被C++使用,並且你不想爲所有的類方法編寫一個C接口。

DLL的用戶使用抽象接口,仍然使用Create和Destroy方法(用extern「C」)創建一個指向抽象接口的指針,但是接着以普通的C++方式使用指針。當然,理想情況下,您會將此指針包裝在智能指針中,例如使用調用Destroy方法的自定義刪除器來提升shared_ptr。 (圖書館的用戶應該這樣做,但你可以提供一個只有標題的界面來做到這一點)。

還有一些其他問題需要注意,如果這樣做,例如任何與運行時類型信息有關的操作都可能無法在用戶端運行,包括異常。再次,您的庫可以提供「開源」C++包裝(在客戶端編譯),以更多的C++方式處理這個問題。一種類型的pImpl。

+0

非常感謝,我可以看到這是一個教育日,我可能會把我的兩個訪問課程合爲一體。爲了避免做任何事情需要花費很長時間並且面臨反彈的風險,將這個類作爲一個單例並讓我的C風格函數在這個單例上運行會有什麼好處? – Bowler 2012-01-17 14:27:44

+0

它爲什麼需要成爲一個單身人士?如果你只有其中一個,並且你需要它可以在全球範圍內使用而不需要作爲參數傳遞,那麼就可以做到這一點。 – CashCow 2012-01-17 16:26:52

+0

只有當接口類的一個實例發生時,我一直試圖在我有'管理器'類的類型時踢單身的習慣。我想知道它在這裏可能是有用的,因爲會有一個C函數調用的單個指針,也許它沒有幫助解決問題。 – Bowler 2012-01-17 16:54:49

0

在整個編譯器中名稱修改不是標準化的。只暴露extern C函數,以便它們不會被名稱損壞。但是這有一個限制,你不能使用對象定位編程。

另一種選擇是實現COM對象,因爲它們是二進制兼容的。