2013-05-11 79 views
1

這可能不是第一次在這裏問題聽起來像那樣,但... 我知道有工具用於從.dll(.def生成器)但是由於編譯器爲函數生成的格式錯誤的名稱格式不同,所以沒有用(對我來說)。 有沒有什麼辦法(可能在.def文件中有一些額外的選項)告訴mingw編譯器:_ZN6IDcDrv6CreateEPKci(MingW的錯位名稱格式)=?創建@ IDcDrv @@ SAPAVDcDrv @@ PBDH @ Z(MSVC的錯位名稱格式)??? ?(重定向lib.a對dll的引用) 我正在談論封閉源代碼的dll,所以我不能編譯一個dll for mingw ...或開源庫,它的建設花費了大量的時間和/或忍耐。MinGW鏈接MSVC的dll庫的麻煩(未定義的參考)

回答

1

不可以。MSVC名稱修改是專有的和未記錄的。

即使你可以在編譯器中得到一致的名稱,也會有很多其他的小差異,會讓你的鏈接代碼在各種奇怪的地方崩潰(類佈局,函數調用等)。

如果您需要互操作性,請編寫一個C接口。 32位MinGW(-w64)GCC甚至可以鏈接到32位MSVC C庫(反之亦然)(如果包含必要的編譯器庫,如libgcc或MSVC默認添加到其代碼生成的安全檢查cookie thingie庫)。

+0

你說得對。但是,如果函數具有這種格式化的'_SomeFunction @ 16'而MinGW正在尋找'SomeFunction'(C聲明),是否可以設置一個引用'SomeFunction' - >'_ SomeFunction @ 16'?順便說一下,使用這個代碼'void(__stdcall * SomeFunction)()=(void(__stdcall *)())GetProcAddress(hModule,「_SomeFunction @ 16」);如果(SomeFunction)SomeFunction();'不會崩潰應用程序(沒有堆棧損壞等)。 – 2013-09-26 13:36:13

+0

編譯器之間的對象佈局和有時甚至是對象定義(在C++ stdlib類型的情況下)是不同的,因此您需要確保不混合它們。總之:不要。 – rubenvb 2013-09-26 15:15:58