MSVC 的 GMP 静态构建 (Windows)

Static build of GMP for MSVC (Windows)

是否可以在 Windows 上构建 GMP for MSVC

我需要完全静态的解决方案(静态库),没有任何 DLL 依赖项。这样我的最终 EXE 不依赖于任何外部(非系统)DLL。

如果构建 GMP 需要 Cygwin or MSYS,我没问题,只要它以后可以在 MSVC 中使用而没有任何问题。但据我所知,至少 Cygwin 构建总是依赖于额外的 DLL,例如 cygwin1.dll,这对我来说是负担不起的,因此需要完全静态库解决方案。

我知道存在 MPIR 更 Windows 友好的库。但现在如果可能的话,我需要专门的 GMP 解决方案。

当然,如果在为 Windows 构建时使用所有优化和汇编,那就太好了。但是,如果无法组装,则至少需要 GMP 的非组装(通用)变体。

当然需要64位版本

如果有人可以 post 为 MSVC 使用生成此类静态库所需的所有步骤?或者 link 一些网站有这样的说明?

我成功地使用 Windows.

下的 MSVC 使用 GMP 编译了一个完全静态的 linked 程序

为此,我安装了 MSYS,它位于我机器上的 c:/bin/msys/

然后在 MSYS shell 中安装 GMP 包 mingw-w64-clang-x86_64-gmpgmp-develpacman -S gmp-devel 安装,pacman -Ss gmp 搜索)。

在 MSVC 编译器中我添加了包含目录 c:/bin/msys/clang64/include/.

用 C++ 编写了一个 GMP 使用程序示例,它使用长算术实现 Trial Division / Pollard's Rho / Pollard's P-1 因式分解算法。该程序同时使用 mpz_...() C 例程和 mpz_class C++ 包装器 class。例如这个程序位于 main.cpp.

我向 linker 命令行添加了以下库:

c:/bin/msys/clang64/lib/libgmp.a
c:/bin/msys/clang64/lib/libgmpxx.a
c:/bin/msys/mingw64/lib/gcc/x86_64-w64-mingw32/10.3.0/libgcc.a
c:/bin/msys/clang64/x86_64-w64-mingw32/lib/libmingwex.a

我还必须添加 /FORCE 标志(阅读 here)到 linker 命令,因为 libmingwex.a 有一些符号与默认 MSVC 的库重叠,恰好没有 /FORCE 我有以下错误:

libucrt.lib(strnlen.obj) : error LNK2005: wcsnlen already defined in libmingwex.a(lib64_libmingwex_a-wcsnlen.o)
libucrt.lib(strnlen.obj) : error LNK2005: strnlen already defined in libmingwex.a(lib64_libmingwex_a-strnlen.o)
bin\win-msvc-m-64-release\drafts\gmp_int_msvc.exe : fatal error LNK1169: one or more multiply defined symbols found

所有步骤都生成了工作(测试)最终静态-linked 程序,没有任何外部 DLL 依赖项(当然 Windows 的默认系统 DLL 除外)。

表示MSYS的库.a完全兼容MSVC,link在MSVC编译成功

没有 /FORCE linker 标志我还做了额外的以下步骤。复制了 c:/bin/msys/clang64/x86_64-w64-mingw32/lib/libmingwex.a 库。使用了 c:/bin/msys/clang64/bin/objcopy.exe util,它可能与 Clang 一起安装。 objcopy重命名重叠符号:

objcopy --redefine-sym wcsnlen=msys_wcsnlen libmingwex.a
objcopy --redefine-sym strnlen=msys_strnlen libmingwex.a

这使我能够在 MSVC 中成功地将这个修改后的 libmingwex.a 库用于 link,而无需使用 /FORCE