使用cygwin构buildWindows的静态库

我正在尝试为Visual Studio 2010下的项目使用Windows的CGAL。CGAL需要GMP和MPFR库,并在分发中提供它们。 但是,它提供了它们作为一个lib + dll包,而我希望他们被静态编译为一个单一的.lib文件的forms。

所以现在我试图在Windows下build立GMP和MPFR作为一个静态库。 我正在使用cygwin来达到这个目的。 经过调用configuremake我有输出与扩展.la文件的附加.la文件。 我不太了解Unix的静态库,所以我build议它和.lib ,只是扩展名不同。 我将它重命名为.lib,并链接到我的项目 – 它很合适。

第一个问题 :我是对的吗? .a和.lib文件是否真的一样? 我看到这个问题,但没有觉得它有用。

然后问题出现了:我有

 error LNK2019: unresolved external symbol ___getreent referenced in function ___gmp_default_reallocate 

似乎有些cygwin函数没有链接到gmp.lib 。 我在这里发现,可以从libcygwin.a导出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将足够聪明,以静态链接此function。 所以,

第二个问题 :如何强制GMP链接库依赖关系? 或者如何在不使用cygwin的情况下正确构buildGMP的窗口

更新:请参阅MPIR项目页面以解答所有问题(它允许您使用Visual Studio构建MPIR,与GMP兼容的库和MPFR)。 新的MPIR主页位于这里 ,但据我所知,缺乏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:

  • 32位
  • 64位

(我推荐我的“Personal Builds”,特别是4.6.3-1软件包,下载4.6.3-1-gcc_rubenvb.7z软件包,但是其他的MinGW软件包应该这样做)

解压到C:\ Dev \ mingw64,以便C:\ Dev \ mingw64 \ bin \ gcc.exe存在。

双击C:\ Dev \ msys \ msys.bat。 类型:

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

然后按回车。 将GMP和MPFR源文件解压缩到你的/ home / USERNAME / *目录,建立目录,记住用于配置:

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

随着

 --host=i686-w64-mingw32 

为32位或

 --host=x86_64-w64-mingw32 

为64位。 我相信GMP也需要 – 建立设定为相同的价值。 配置完成后,键入make ,然后make install ,可选地在make check之前。

你应该在/ easytemplibinstalldir / lib中有libgmp.a。 对于MPFR,请添加

 --with-gmp=/easytemplibinstalldir 

到其配置线。

您必须以正确的顺序手动链接libgmp和libmpfr才能正常工作,因此在Windows上不能自动进行依赖关系链接。