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

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

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

如果构建 GMP 需要 CygwinMSYS,我没问题,只要它可以稍后在 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-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++ 包装类。比如这个程序位于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
    相关资源
    最近更新 更多