我正在嘗試構建CGAL,以便在Visual Studio 2010下的項目中使用windows。CGAL需要GMP和MPFR庫並提供它們以供分發。但是,它將它們作爲lib + dll包提供,而我希望它們以單個.lib文件的形式靜態編譯。使用cygwin構建windows的靜態庫
所以,現在我試圖建立GMP和MPFR作爲Windows下的靜態庫。我使用cygwin作爲建議here。呼叫configure
和make
我有輸出庫與.a
擴展與附加.la
文件。我對Unix的靜態庫知之甚少,所以我建議它與.lib
一樣,只是擴展名不同。我將它重命名爲.lib並鏈接到我的項目 - 它很合適。
第一個問題:我正確嗎? .a和.lib文件是否真的一樣?我看到this的問題,但沒有發現它足夠有用。
於是問題出現了:我有
error LNK2019: unresolved external symbol ___getreent referenced in function ___gmp_default_reallocate
好像一些cygwin的功能都沒有,導致gmp.lib
鏈接。我發現here,getreent
可能從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?
這怎麼可能是MSVC(或其他)無法鏈接與MinGW(或whoever)構建的.lib?我雖然.lib是獨立於編譯器的。 – Mikhail 2012-02-24 18:00:51
@Mikhail哦,不,不是。 MinGW GCC生成'.a'文件,不涉及'.lib'。 MSVC不關心GCC的輸出格式,爲什麼它應該能夠鏈接?另一方面,GCC可以鏈接到由MSVC生成的32位'.lib'文件,因爲一些GCC/binutils開發人員已經足夠關注它,使其成爲可能。 – rubenvb 2012-02-24 18:09:15
所以,你的意思是現在有辦法在Windows下建立GMP到static .lib?這很混亂。爲什麼我能夠將cygwin生成的gmp.a文件與MSVC鏈接起來? – Mikhail 2012-02-24 18:53:11