我正在尝试为Visual Studio 2010下的项目使用Windows的CGAL。CGAL需要GMP和MPFR库,并在分发中提供它们。 但是,它提供了它们作为一个lib + dll包,而我希望他们被静态编译为一个单一的.lib文件的forms。
所以现在我试图在Windows下build立GMP和MPFR作为一个静态库。 我正在使用cygwin来达到这个目的。 经过调用configure
和make
我有输出与扩展.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:
(我推荐我的“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上不能自动进行依赖关系链接。