使用cygwin为windows构建静态库

时间:2012-02-24 17:42:10

标签: c++ windows dependencies cygwin

我正在尝试为我在Visual Studio 2010下的项目中使用的Windows构建CGAL。CGAL需要GMPMPFR库并在分发中提供它们。但是,它将它们作为lib + dll包提供,而我希望它们以单个.lib文件的形式静态编译。

所以现在我正在尝试在Windows下构建GMP和MPFR作为静态库。我按照建议here为此目的使用cygwin。在致电configuremake后,我输出了带有.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?

1 个答案:

答案 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上不能进行自动依赖关系链接。