gpt4 book ai didi

c++ - 使用 cygwin 为 windows 构建静态库

转载 作者:可可西里 更新时间:2023-11-01 11:36:51 24 4
gpt4 key购买 nike

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

所以现在我正在尝试将 GMP 和 MPFR 构建为 Windows 下的静态库。我按照建议将 cygwin 用于此目的 here .在调用 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?

最佳答案

更新:参见 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 上不可能为此进行自动依赖链接。

关于c++ - 使用 cygwin 为 windows 构建静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9435442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com