我正在尝试为我在Visual Studio 2010下的项目中使用的Windows构建CGAL。CGAL需要GMP和MPFR库并在分发中提供它们。但是,它将它们作为lib + dll包提供,而我希望它们以单个.lib文件的形式静态编译。
所以现在我正在尝试在Windows下构建GMP和MPFR作为静态库。我按照建议here为此目的使用cygwin。在致电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的情况下为Windows正确构建GMP?
答案 0 :(得分:2)
更新:请参阅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 \ bin \ gcc.exe。
双击C:\ Dev \ msys \ msys.bat。类型:
export PATH=/c/Dev/mingw64/bin:$PATH
按回车键。将GMP和MPFR源解压缩到/ home / USERNAME / * 目录,制作构建目录,并记住用于configure:
--enable-static --disable-shared --prefix=/easytemplibinstalldir
与
一起--host=i686-w64-mingw32
表示32位或
--host=x86_64-w64-mingw32
表示64位。我相信GMP还要求--build
设置为相同的值。配置完成后,键入make
,然后键入make install
,可选择前面加make check
。
你应该在/ easytemplibinstalldir / lib中有libgmp.a。对于MPFR,添加
--with-gmp=/easytemplibinstalldir
到其配置行。
您必须以正确的顺序手动链接libgmp和libmpfr才能使用它,在Windows上不能进行自动依赖关系链接。