使用cygwin为windows构建静态库

Building static libraries for windows using cygwin

本文关键字:静态 构建 windows cygwin 使用      更新时间:2023-10-16

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

所以现在我正在尝试将GMP和MPFR构建为windows下的静态库。正如这里所建议的,我使用cygwin来达到这个目的。在调用configuremake之后,我有一个扩展名为.a的输出库和额外的.la文件。我对Unix的静态库了解不多,所以我建议它与.lib相同,只是扩展名不同。我把它重命名为.lib,并链接到我的项目——它非常适合。

第一个问题:我这样做正确吗?.a和.lib文件真的一样吗?我看到了这个问题,但觉得它不够有用。

然后问题出现了:我有

error LNK2019: unresolved external symbol ___getreent referenced in function ___gmp_default_reallocate

似乎某些cygwin函数在生成的gmp.lib中没有链接。我在这里发现,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?

UPDATE:有关所有问题的答案,请参阅MPIR项目页面(它允许您使用Visual Studio构建MPIR、GMP兼容库和MPFR)。新的MPIR主页位于此处,但据我所知,缺少MPFR信息。


你不想要赛格文。

你需要一个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位

(我推荐我的"个人构建",尤其是4.6.3-1包。下载4.6.3-1-gcc_rubenvb.7z包,但任何其他MinGW捆绑包都应该这样做)

解压缩为C:\Dev\mingw64,这样C:\Dev\ming w64\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也要求--build设置为相同的值。配置完成后,键入make,然后键入make install,可选择在其前面加上make check

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

--with-gmp=/easytemplibinstalldir

到其配置行。

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