【问题标题】:Building static libraries for windows using cygwin使用cygwin为windows构建静态库
【发布时间】:2012-03-15 04:19:22
【问题描述】:

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

所以现在我正在尝试将 GMP 和 MPFR 构建为 windows 下的静态库。正如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。我发现heregetreent 可能是从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?

【问题讨论】:

    标签: c++ windows dependencies cygwin


    【解决方案1】:

    更新:请参阅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/* 目录,制作构建目录,并记住用于配置:

    --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 上无法为此进行自动依赖链接。

    【讨论】:

    • MSVC(或其他)怎么可能无法链接使用 MinGW(或其他任何人)构建的 .lib?我虽然 .lib 是独立于编译器的。
    • @Mikhail 哦,不,不是。 MinGW GCC 生成一个.a 文件,不涉及.lib。 MSVC 不关心 GCC 的输出格式,为什么要能够链接呢?另一方面,GCC 可以链接到由 MSVC 生成的 32 位 .lib 文件,因为一些 GCC/binutils 开发人员非常关心它以使其成为可能。
    • 那么,你的意思是现在有办法在 Windows 下将 GMP 构建为静态 .lib 吗?这很令人困惑。为什么我可以将 cygwin 生成的 gmp.a 文件与 MSVC 链接?
    • @Mikhail 我不知道用 MSVC 构建 GMP 的方法。没有什么令人困惑的:GMP 是一个 GNU 项目,使用 C99,而 MSVC 不能与它们中的任何一个相处。我想文件格式的兼容性有限(请参阅here for example),但是将 Cygwin 代码与 MSVC 链接是自找麻烦。请参阅更新以获取可轻松通过 Google 搜索的信息。
    • @xamid 三元组x86_64-w64-mingw64 不存在。三元组构建为架构供应商操作系统。在这种情况下,“os”是 mingw32,由于历史原因,这意味着 GCC 看到的 Win32 API。对于 64 位和 32 位 Windows,此 Win32 API 相同。 w64 来自 MinGW-w64,它提供了构建此编译器的 C 运行时。您下载的 32 位编译器具有三元组 i686-w64-mingw32,其中第一位 i686 表示 32 位。
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多