使用cygwin为windows构建静态库
Building static libraries for windows using cygwin
我正在尝试为windows构建CGAL,以便在Visual Studio 2010下的项目中使用。CGAL需要GMP和MPFR库,并在分发中提供它们。然而,它将它们作为lib+dll捆绑包提供,而我希望它们以单个.lib文件的形式静态编译。
所以现在我正在尝试将GMP和MPFR构建为windows下的静态库。正如这里所建议的,我使用cygwin来达到这个目的。在调用configure
和make
之后,我有一个扩展名为.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上不可能自动进行依赖关系链接。
- 如何使用cmake设置OpenCV以启用动态和静态构建
- 如何静态构建并在Windows上包含WolfSSL
- g libcurl静态构建在NGHTTP2库上失败
- 完全静态构建具有所有依赖项(libgcc等)的应用程序
- 使用MinGW 6.3.0时,Qt 5.7.0的静态构建无法完成
- 使用内置MySQL库的Qt静态构建
- 在windows 7上静态构建Qt 5.1.1-nmake和cl错误
- 使用静态构建curl链接项目
- 在Windows上静态构建CPython——链接问题
- 没有 DLL 依赖项的静态构建可执行文件
- Qt 5.4 静态构建在 Visual Studio 2013 中产生"unresolved external symbol"链接错误
- 使用Qt制作静态构建(独立应用程序)
- 在我的CMake项目中使用静态构建而不是OpenCV的共享构建
- 静态构建Qt后,我无法在Windows 7上编译/链接应用程序(GNU分配器错误)
- Qt静态构建在虚拟机(win7 32位)上需要很长时间
- 静态构建Qt 5.1
- 如何在c++XE5 embacadero中为项目创建静态构建
- 使用Visual Studio将静态构建的库链接到共享库可能存在内存风险
- 如何使用Qt的静态构建为Windows创建静态链接版本
- QT 5.7 MSVC 2015静态构建不工作