【问题标题】:Static build of GMP for MSVC (Windows)用于 MSVC (Windows) 的 GMP 静态构建
【发布时间】:2021-11-12 20:42:35
【问题描述】:

是否可以在 Windows 上为 MSVC 构建 GMP?

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

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

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

如果在为 Windows 构建时使用所有优化和组装当然会很棒。但如果无法组装,那么至少需要 GMP 的非组装(通用)变体。

当然我需要 64 位版本。

如果有人可以发布为 MSVC 使用生成此类静态库所需的所有步骤?或者也许链接一些有此类说明的网站?

【问题讨论】:

  • msys2 不提供预建的静态库吗?
  • @MarcGlisse MSYS/Cygwin 都有预建库。但我的问题的主要思想是如何构建可以直接在 MSVC 中使用的 GMP。不知道 MSYS 的版本库能不能直接在 MSVC 中使用?至少它有.a 扩展名,这意味着应该重新打包到.lib 以供MSVC 使用。但是是否足以重新打包以在 MSVC 中毫无问题地使用它?另外,也许我错了,由于某些原因,MSYS/Cygwin 构建不能直接在 MSVC 中使用。还有.a解包后的存档有.o对象,如果打包成.lib,它们是否与MSVC兼容?

标签: c windows visual-c++ build gmp


【解决方案1】:

我成功地在 Windows 下使用 MSVC 编译了一个使用 GMP 的完全静态链接程序。

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

然后在 MSYS shell 中安装 GMP 包 mingw-w64-clang-x86_64-gmp 和 gmp-devel(pacman -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++ 包装类。比如这个程序位于main.cpp。

到链接器命令行我添加了以下库:

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),因为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

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

表示MSYS的库.a完全兼容MSVC,在MSVC编译中链接成功。

没有/FORCE 链接器标志我还做了额外的以下步骤。复制了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

这让我能够成功地使用这个修改后的libmingwex.a 库在 MSVC 中链接而不使用/FORCE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 2020-09-19
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2015-07-02
    • 1970-01-01
    相关资源
    最近更新 更多