MSVC的GMP静态构建(Windows)

i34xakig  于 2023-04-05  发布在  Windows
关注(0)|答案(2)|浏览(288)

是否可以在Windows上为MSVC构建GMP
我需要完全静态的解决方案(静态库),没有任何DLL的依赖关系。所以我的最终EXE不依赖于任何外部(非系统)DLL。
如果构建GMP需要CygwinMSYS,我没问题,只要它可以在MSVC中使用,没有任何问题。但据我所知,至少Cygwin构建总是依赖于额外的DLL,如cygwin1.dll,这对我来说是负担不起的,需要完全静态库解决方案。
我知道有存在MPIR库,是更Windows友好。但现在我需要特别GMP解决方案,如果可能的话。
当然,如果在为Windows构建时使用所有优化和汇编,那就太好了。但是如果汇编是不可能的,那么至少需要GMP的非汇编(通用)变体。
当然我需要64位版本。
如果有人可以张贴所有的步骤需要产生这样的静态库MSVC使用?或者也许链接一些网站,有这样的指示?

iyzzxitl

iyzzxitl1#

我成功地设法编译了一个工作完全静态链接的程序与GMP使用MSVC在Windows下。
为此,我使用了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 Package 类。例如,该程序位于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

xpcnnkqh

xpcnnkqh2#

很抱歉我的回答很简短,因为我没有时间。
我从here下载了MPIR源代码
关于如何建立库的解释是由伟大的Thomas Kim一个韩国导师在计算机语言的各个领域是here .我一直在努力建设GMP x64位的Windows和MPIR库来救我.我用Microsoft Visual Studio(VC++)建立.
我使用GMP库编写的代码几乎是用MPIR构建的,除了添加库之外没有任何更改。

相关问题