使用cygwin构建windows的静态库

问题描述:

我正在尝试构建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?

更新:请参阅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