2016-02-19 37 views
1

Qt庫說明了跨主要版本的二進制兼容性。但是,不同編譯器之間的兼容性呢?編譯器之間的qt dll兼容性

例如,我有一個應用程序和2倍的DLL使用Qt(動態鏈接)。但其中一個是用MSVC和另一個用MinGW構建的。因此,它們與不同版本的Qt庫(相同版本)相關聯。

問題是:這些DLL可以使用一個共享的Qt DLL一起工作嗎? 如果沒有,那麼考慮到更改編譯器不是一種選擇,哪種解決方法是可能的?

我看了看Qt的DLL文件與Dependency Walker中,我看到有幾十個具有編譯器scpecific名稱重整導出的函數。所以看起來不可能讓他們一起工作。

+0

***但是對於不同的編譯器之間的兼容性如何?***他們是因爲超過1個CRT(會引起你的隨機找堆損壞)和不同的執行標準庫(也UB)不兼容。 – drescherjm

+0

是的,但只能使用一個Qt dll - >因此只有一個Qt CRT。 –

+0

Qt可能來自一個編譯器,但我認爲這兩個.dll使用Qt甚至是C++標準庫。如果出現這種情況,您將擁有跨越CRT邊界和不兼容的ABI問題的對象。 – drescherjm

回答

2

C++沒有標準ABI。這意味着,包含DLL文件的二進制文件在編譯器之間通常不兼容(它們甚至可能在相同編譯器的不同編譯選項之間兼容)。這是MSVC與MinGW的情況,沒有DLL兼容性。

平原C庫在Windows上定義的ABI,所以他們可以與任何編譯器(你可能仍然會碰到的問題與不相容的依賴庫,即使ABI兼容)一起使用。


如果重新編譯一個庫是不是一種選擇,那麼我所知道的唯一的解決方法是有獨立的進程,然後使用一些IPC機制進行通信。如果兩個庫都提供GUI元素,並且您想將它們混合在同一個GUI中,那麼這是不可能的(或者至少很難,您需要在另一個窗口中打開其他應用程序的窗口,有點像疊加層)。

+0

是的,我知道。但我在想,Qt的設計是爲了保持COM方法。似乎它不是真的。 是的,我需要的是GUI交互。 –

+0

Qt的設計不像COM。 – drescherjm

+0

@ArtyomChirkov Qt是純C++(是的,有些代碼是由* MOC *生成的,但生成的代碼也是純C++,並通過約束編譯器做了什麼C++),並不能真正解決這樣的低級不相容的東西就像二進制庫中的名字混雜。 – hyde