[英]Is it possible to use a gcc compiled library with MSVC?
我有一個依賴libiconv
進行多項操作的項目。
我正在為Visual Studio 2008使用iconv.lib
預編譯二進制文件,但現在我不得不繼續使用Visual Studio 2010,並且沒有更多預編譯的二進制文件可用。
我決定自己編譯它,但正如libiconv
文檔所述,沒有官方支持MSVC編譯器。 但是,我在某處讀到gcc
可以生成與MSVC編譯器二進制兼容的靜態庫,只要二進制接口保留在C
。 雖然這聽起來很瘋狂,但我試了一下它實際上幾乎奏效了。
我編譯了它,將libiconv.a
重命名為iconv.lib
並嘗試iconv.lib
鏈接。 (如果這是一個壞主意,請告訴我)。
首先我遇到了一個鏈接錯誤:
1>iconv.lib(iconv.o) : error LNK2001: unresolved external symbol ___chkstk
經過一些研究,我重新編譯了libiconv
(在x86和x64版本中),添加了-static-libgcc
標志。
它工作,但只適用於我的程序的x64版本。 x86版本始終失敗並出現相同的錯誤。
我應該怎么做才能使這項工作?
是的,這是可能的,因為如果你嚴格編譯為C接口,iconv將鏈接到msvcrt.lib
,這是Windows C運行時(嚴格地說是C,類似於GCC使用的glibc
)。 如果你使用GCC的普通C ++編譯器構建它,它將鏈接到libstdc++
並且與VC ++(與msvcr.dll
鏈接)相比,也會命名mangle。
在您的情況下, __chkstk
是檢查堆棧函數 (C運行時的一部分),這是一個注入每個函數調用以檢查堆棧溢出的函數。 我不知道如何解決這個'好'的方式,但是你可以改變iconv的構建選項來構建一個額外的編譯器標志並禁止這個檢查: /Gs999999
但是,我使用Visual C ++ 2005/2008/2010構建了libiconv,並且我在其上構建的軟件工作得很好(軍事機構使用的軟件,如果你需要可信度)。 我確實記得使用VC ++編譯器構建有點煩人,但它不應該太痛苦。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.