使用cygwin构建windows的静态库
我正在尝试构建CGAL,以便在Visual Studio 2010下的项目中使用windows。CGAL需要GMP和MPFR库并提供它们以供分发。但是,它将它们作为lib + dll包提供,而我希望它们以单个.lib文件的形式静态编译。使用cygwin构建windows的静态库
所以,现在我试图建立GMP和MPFR作为Windows下的静态库。我使用cygwin作为建议here。呼叫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的情况下为窗口正确构建GMP?
更新:请参阅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 \ b在\ gcc.exe中存在。
双击C:\ Dev \ msys \ msys.bat。类型:
export PATH=/c/Dev/mingw64/bin:$PATH
然后按回车。解压GMP和MPFR源到你的/ home /用户名/ *目录,使生成目录,并记得使用配置:
--enable-static --disable-shared --prefix=/easytemplibinstalldir
随着
--host=i686-w64-mingw32
为32位或
--host=x86_64-w64-mingw32
for 64-bit。我相信GMP也要求--build
设置为相同的值。配置完成后,键入make
,然后make install
,可选地以make check
开头。
你应该在/ easytemplibinstalldir/lib中有libgmp.a。对于MPFR,请将
--with-gmp=/easytemplibinstalldir
添加到其配置行。
您必须以正确的顺序手动链接libgmp和libmpfr才能正常工作,因此Windows上无法实现自动依赖关系链接。
这怎么可能是MSVC(或其他)无法链接与MinGW(或whoever)构建的.lib?我虽然.lib是独立于编译器的。 – Mikhail 2012-02-24 18:00:51
@Mikhail哦,不,不是。 MinGW GCC生成'.a'文件,不涉及'.lib'。 MSVC不关心GCC的输出格式,为什么它应该能够链接?另一方面,GCC可以链接到由MSVC生成的32位'.lib'文件,因为一些GCC/binutils开发人员已经足够关注它,使其成为可能。 – rubenvb 2012-02-24 18:09:15
所以,你的意思是现在有办法在Windows下建立GMP到static .lib?这很混乱。为什么我能够将cygwin生成的gmp.a文件与MSVC链接起来? – Mikhail 2012-02-24 18:53:11