回覆列表
  • 1 # 使用者6646074758134

    兩個編譯器的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框架中的面向物件,就是這麼實現的。

  • 中秋節和大豐收的關聯?
  • 難言為啥不直播?