首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Visual为windows编译GMP

如何使用Visual为windows编译GMP
EN

Stack Overflow用户
提问于 2017-11-17 21:17:50
回答 3查看 7.4K关注 0票数 5

我试着在窗户上安装gmp。我已经找到了从windows源代码编译的混合方式。但无法从GMP6.1.2或visual项目中找到二进制文件,以便从源代码中编译。所以问题是:我可以在哪里下载GMP6.1.2二进制文件,或者使用Visual从源代码中编译。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-26 09:52:04

我将描述在Windows中编译GMP的三种方法。

First

安装VisualStudio2022社区从这一页

将VCPKG包管理器安装为在此描述,基本上只需执行两个步骤:

git clone https://github.com/Microsoft/vcpkg --depth=1

vcpkg目录中运行

cmd /c bootstrap-vcpkg.bat

设置系统环境变量VCPKG_DEFAULT_TRIPLET=x64-windows-static,为此按WinKey+Pause,然后单击“高级系统设置”,然后单击“环境变量”,在“系统变量”中单击“新建”,并将VCPKG_DEFAULT_TRIPLET的值设置为x64-windows-static

而不是上面这个步骤(设置变量),您只需将三重直接传递给所有vcpkg命令,比如vcpkg install gmp --triplet=x64-windows-static

在vcpkg的git目录中运行以下命令:

vcpkg install gmp --triplet=x64-windows-static

(如我前面所述,如果设置环境变量,则可以省略--triplet=x64-windows-static )。

这将需要相当多的时间,它将编译许多软件包的来源。

完整编译完成后,它将显示在控制台路径到ZIP文件与已编译的GMP库。在我的系统上,ZIP文件是在C:\Users\user\AppData\Local\vcpkg\archives\8d\8d1c08fabf677187083dedd12d6accf7114d91580e75611c065f1674b600bee9.zip创建的。

解压缩这个ZIP文件,然后您可以像下面这样编译您的C++程序:

cl program.cpp /O2 /GL /EHsc /std:c++latest /Ipath_to_unpacked_zip/include/ path_to_unpacked_zip/lib/gmp.lib

您可能知道,cl命令应该从"Windows菜单/VisualStudio2022 /“中找到的"x64本机命令提示符”运行。

您也可以安装MPIR,而不是GMP,这是GMP的分支,具有相同的界面,但更受Windows用户的青睐。只需做vcpkg install mpir,但这是可以做到的,只有当你删除GMP包,只有一个MPIR或GMP可以安装。

第二

此步骤不编译GMP,而是使用来自MinGW安装的预编译二进制文件。

按照第一步安装Visual。

主页 of MSYS2。下载安装程序,链接位于"1。下载安装程序:“短语。安装到任何位置,例如c:\bin\msys\

在Windows中安装菜单转到应用程序"MSYS2 64位“并在其内部启动程序"MSYS2 MSYS”之后,它将运行类似Unix的shell,从它执行:

pacman -S msys/binutils msys/gcc msys/mingw-w64-cross-crt-git clang64/mingw-w64-clang-x86_64-gmp

上面的命令将安装使用GMP所需的所有软件包。如果您需要更多的包使用-Ss选项,比如pacman -Ss clang,这将搜索CLang,因此-Ss会搜索和安装-S

如果您需要一段时间后,pacmans -Syu命令更新所有已安装的包,运行此命令两次,一次更新基本系统文件,第二次更新所有其他包(第一次需要关闭并再次打开MSYS )。

现在,由于与Visual的libmingwex.a库发生冲突,您需要对库内的两个符号进行调整,将其重命名。

在下面的两个命令中,我假设您的MSYS安装文件夹是c:\dev\msys\,您可以将其更改为已安装的一个。

c:\bin\msys\usr\bin\objcopy.exe --redefine-sym wcsnlen=wcsnlen_renamed --redefine-sym strnlen=strnlen_renamed c:\bin\msys\opt\x86_64-w64-mingw32\lib\libmingwex.a c:\bin\msys\opt\x86_64-w64-mingw32\lib\libmingwex_renamed.a

(这将创建文件libmingwex_renamed.a,在libmingwex.a库中重命名两个符号)

现在一切就绪,您可以编译C++程序,如下所示:

cl program.cpp /O2 /GL /EHsc /std:c++latest /Ic:\bin\msys\clang64\include\ c:\bin\msys\clang64\lib\libgmp.a c:\bin\msys\usr\lib\gcc\x86_64-pc-msys\11.3.0\libgcc.a c:\bin\msys\opt\x86_64-w64-mingw32\lib\libmingwex_renamed.a

请注意,在上面的命令中,我使用了3个库libgmp.alibgcc.alibmingwex_renamed.a。还请注意,libgcc.a是从子文件夹\11.3.0\获取的,它是已安装的GCC的当前版本,但是当MSYS2将GCC更新到以后的版本时,这个版本子文件夹应该相应地进行更改。

第三代

安装Visual,如在第一步和第二步。

在这一步中,我们将使用MPIR,它是GMP的叉子,非常好的叉子更适合Windows。

克隆储存库:

git clone https://github.com/BrianGladman/mpir --depth=1

在文件夹.\mpir\msvc\vs22\中运行:

cmd /c msbuild.bat gc LIB x64 Release

上面的命令构建了适合于任何CPU的通用版本。在那之后

cmd /c msbuild.bat skylake_avx LIB x64 Release

它构建了非常优化的版本,比泛型更快。

非常重要的。如果第二个(skylake)构建失败,那么泛型(gc)版本可以使用,但它甚至可以慢5倍。如果快速Skylake版本失败了,那么最好不要使用这种第三种方式来编译GMP,除非您不能做其他的事情,或者如果慢版本对您来说已经足够了。

上面的命令应该像往常一样在开始菜单中的Visual的"x64本机命令提示符“外壳中运行。

在构建完成GMP (实际上MPIR)之后,您可以将您的程序编译为:

cl program.cpp /O2 /GL /EHsc /std:c++latest /Ipath_to_mpir_repo\msvc\vs22\lib_mpir_skylake_avx\x64\Release\ path_to_mpir_repo\msvc\vs22\lib_mpir_skylake_avx\x64\Release\mpir.lib

请注意,在上面的命令中,我使用了\lib_mpir_skylake_avx\子文件夹来优化AVX版本,如果只有通用版本,请使用\lib_mpir_gc\子文件夹。

票数 3
EN

Stack Overflow用户

发布于 2017-11-18 14:19:26

用VisualStudio在Windows上编译GMP可能很棘手,但是已经有一些这样的问题,这可能对您有帮助(取决于您的具体用例):

简单的答案是,由于VisualStudio是在考虑到的情况下开发的,因此没有任何可以直接使用GMP编译的GMP源。

你的备选方案摘要:

  1. 使用MinGW发行版中提供的GMP版本
  2. 使用MinGW/Cygwin编译自己的GMP
  3. 使用GMP的MPIR叉,使用VisualStudio可编译
  4. 试着自己解决所有的编译问题,旧的GMP版本的一些提示如下:

票数 3
EN

Stack Overflow用户

发布于 2022-11-08 16:38:58

当我同时需要gmp和gmpxx时,我在Windows 11中也遇到了同样的问题,多亏了@Arty,只有第一个选项起作用。惟一要添加的是,应该在具有管理权限的终端中运行vcpkg install gmp --triplet=x64-windows-static命令,否则将发生以下错误:

文件重命名失败

代码语言:javascript
运行
复制
C:/Users/Desktop/polycut/vcpkg/packages/gmp_x64-windows-static

代码语言:javascript
运行
复制
C:/Users/Desktop/polycut/vcpkg/packages/gmp_x64-windows-static_tmp

因为:访问被拒绝。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47359417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档