2012-02-24 137 views
1

我正在嘗試構建CGAL,以便在Visual Studio 2010下的項目中使用windows。CGAL需要GMPMPFR庫並提供它們以供分發。但是,它將它們作爲lib + dll包提供,而我希望它們以單個.lib文件的形式靜態編譯。使用cygwin構建windows的靜態庫

所以,現在我試圖建立GMP和MPFR作爲Windows下的靜態庫。我使用cygwin作爲建議here。呼叫configuremake我有輸出庫與.a擴展與附加.la文件。我對Unix的靜態庫知之甚少,所以我建議它與.lib一樣,只是擴展名不同。我將它重命名爲.lib並鏈接到我的項目 - 它很合適。

第一個問題:我正確嗎? .a和.lib文件是否真的一樣?我看到this的問題,但沒有發現它足夠有用。

於是問題出現了:我有

error LNK2019: unresolved external symbol ___getreent referenced in function ___gmp_default_reallocate 

好像一些cygwin的功能都沒有,導致gmp.lib鏈接。我發現heregetreent可能從libcygwin.a導出。所以我把它複製到libcygwin.lib並鏈接到我的項目。毫不奇怪,我收到以下錯誤:

error LNK2005: _strcpy already defined in libcygwin.lib(t-d001719.o) in libcmtd.lib(strcat.obj) 

當然,我不知道是什麼功能,以及如何在這個庫中聲明,好像strcpy與一個從Visual Studio衝突。我真正想要發生的事情是gmp.lib會足夠聰明,以靜態鏈接此功能。所以,

第二個問題:如何強制GMP鏈接庫依賴? 如何在不使用cygwin的情況下爲窗口正確構建GMP?

回答

1

更新:請參閱MPIR project page以解答所有問題(它允許您使用Visual Studio構建MPIR,與GMP兼容的庫和MPFR)。據我所知,新的MPIR主頁位於here,但缺乏MPFR信息。


你不想要Cygwin。

你需要一個Bash shell和MinGW(.org/-w64)。如果使用cygwin編譯器構建,則需要鏈接到Cygwin DLL,這在您的情況下很愚蠢,因爲GMP和MPFR都可以由MinGW構建。我不相信任何一個庫都可以通過MSVC構建,並且MSVC不能與MinGW庫鏈接(這正是您的項目作者捆綁DLL和導入庫的原因),所以您可以需要使用MinGW GCC或使用DLL來構建所有內容。


以下是關於構建GMP和MPFR的GCC靜態庫的說明。

要使用MinGW-w64 GCC爲Windows構建GMP,您需要MSYS。解壓到C:\ Dev \ msys這樣的地方,以便C:\ Dev \ msys \ bin \ sh。EXE存在。

然後你需要一個與MinGW-W64 GCC:

(我推薦我的 「個人構建」,尤其是4.6.3-1包。下載4.6.3-1-gcc_rubenvb.7z軟件包,但任何其他MinGW軟件包都應該這樣做)

解壓縮爲C:\ Dev \ mingw64,以便C:\ Dev \ mingw64 \ b在\ gcc.exe中存在。

雙擊C:\ Dev \ msys \ msys.bat。類型:

export PATH=/c/Dev/mingw64/bin:$PATH 

然後按回車。解壓GMP和MPFR源到你的/ home /用戶名/ *目錄,使生成目錄,並記得使用配置:

--enable-static --disable-shared --prefix=/easytemplibinstalldir 

隨着

--host=i686-w64-mingw32 

爲32位或

--host=x86_64-w64-mingw32 

for 64-bit。我相信GMP也要求--build設置爲相同的值。配置完成後,鍵入make,然後make install,可選地以make check開頭。

你應該在/ easytemplibinstalldir/lib中有libgmp.a。對於MPFR,請將

--with-gmp=/easytemplibinstalldir 

添加到其配置行。

您必須以正確的順序手動鏈接libgmp和libmpfr才能正常工作,因此Windows上無法實現自動依賴關係鏈接。

+0

這怎麼可能是MSVC(或其他)無法鏈接與MinGW(或whoever)構建的.lib?我雖然.lib是獨立於編譯器的。 – Mikhail 2012-02-24 18:00:51

+0

@Mikhail哦,不,不是。 MinGW GCC生成'.a'文件,不涉及'.lib'。 MSVC不關心GCC的輸出格式,爲什麼它應該能夠鏈接?另一方面,GCC可以鏈接到由MSVC生成的32位'.lib'文件,因爲一些GCC/binutils開發人員已經足夠關注它,使其成爲可能。 – rubenvb 2012-02-24 18:09:15

+0

所以,你的意思是現在有辦法在Windows下建立GMP到static .lib?這很混亂。爲什麼我能夠將cygwin生成的gmp.a文件與MSVC鏈接起來? – Mikhail 2012-02-24 18:53:11