兩個編譯器的c++ abi不相容的,所以無法識別對方匯出的符號完成連結。
但是可以用c語言中轉,c的abi在所有編譯器中都是相同的。
簡單來說,把vc動態庫所有匯出介面都改為extern "C"形式即可,這樣生成的動態庫,MinGW是可以正確連結使用的,反之亦然。
但注意要規避一個問題,不要跨越動態庫邊界分配/釋放記憶體,因為兩邊用的並不是同一套malloc/free。
並且釋出程式時,兩邊的依賴都要帶齊,比如vc庫依賴的msvcrt等,mingw程式依賴的libpthread等。
關於c++物件,可以為其定義由純虛擬函式組成的介面類,用c介面構造並返回介面指標,透過介面指標呼叫方法,這樣的操作是沒問題的。
不過虛介面的方式,其實是依賴了編譯器的虛表結構,並沒有在語言層面保證一定可用,最保險的方式,還是參考windows api的handle和linux api的fd。
即把ptr->function()改造為純c的function(ptr)形式,這樣還避免了虛擬函式的間接呼叫開銷。
而需要執行時多型的虛擬函式,可以改為在ptr中顯示儲存函式指標來模擬虛表。
其實,各類大型c框架中的面向物件,就是這麼實現的。
兩個編譯器的c++ abi不相容的,所以無法識別對方匯出的符號完成連結。
但是可以用c語言中轉,c的abi在所有編譯器中都是相同的。
簡單來說,把vc動態庫所有匯出介面都改為extern "C"形式即可,這樣生成的動態庫,MinGW是可以正確連結使用的,反之亦然。
但注意要規避一個問題,不要跨越動態庫邊界分配/釋放記憶體,因為兩邊用的並不是同一套malloc/free。
並且釋出程式時,兩邊的依賴都要帶齊,比如vc庫依賴的msvcrt等,mingw程式依賴的libpthread等。
關於c++物件,可以為其定義由純虛擬函式組成的介面類,用c介面構造並返回介面指標,透過介面指標呼叫方法,這樣的操作是沒問題的。
不過虛介面的方式,其實是依賴了編譯器的虛表結構,並沒有在語言層面保證一定可用,最保險的方式,還是參考windows api的handle和linux api的fd。
即把ptr->function()改造為純c的function(ptr)形式,這樣還避免了虛擬函式的間接呼叫開銷。
而需要執行時多型的虛擬函式,可以改為在ptr中顯示儲存函式指標來模擬虛表。
其實,各類大型c框架中的面向物件,就是這麼實現的。