17

我已按照“Windows 平台的 GMP 安装说明”中的说明进行操作。我可以构建一个可用于 Visual Studio 的 32 位版本的 GMP。

./configure --prefix=${gmp-install} --disable-static --enable-shared
make
make install

然后我在另一台机器(运行 64 位 Windows)上安装了 mingw_w64 和 msys 并重新运行命令。

./configure 运行没有任何问题。但是,当我运行“make”时,我得到了以下信息。

m4  -DHAVE_CONFIG_H -D__GMP_WITHIN_GMP -DOPERATION_add_n -DDLL_EXPORT -DPIC add_n.asm >tmp-add_n.s
gcc -std=gnu99 -c -DHAVE_CONFIG_H -I. -I.. -D__GMP_WITHIN_GMP -I.. -DOPERATION_add_n -O2 -pedantic -fomit-frame-pointer -mno-cygwin tmp-add_n.s -DDLL_EXPORT -DPIC -o .libs/add_n.o
tmp-add_n.s: Assembler messages:
tmp-add_n.s:84: Error: operand type mismatch for `push'
tmp-add_n.s:85: Error: operand type mismatch for `push'
tmp-add_n.s:86: Error: operand type mismatch for `push'
tmp-add_n.s:107: Error: operand type mismatch for `jmp'
tmp-add_n.s:114: Error: operand type mismatch for `pop'
tmp-add_n.s:115: Error: operand type mismatch for `pop'
tmp-add_n.s:116: Error: operand type mismatch for `pop'
make[2]: *** [add_n.lo] Error 1
make[2]: Leaving directory `/d/Temp/gmp-5.0.1/mpn'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/d/Temp/gmp-5.0.1'
make: *** [all] Error 2

如果我改用“gmake”,则会显示以下错误。

m4 gcc  -DHAVE_CONFIG_H -D__GMP_WITHIN_GMP -DOPERATION_add_n -DDLL_EXPORT -DPIC add_n.asm >tmp-add_n.s
m4: gcc: No such file or directory
gmake[2]: *** [add_n.lo] Error 1
gmake[2]: Leaving directory `d:/Temp/gmp-5.0.1/mpn'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `d:/Temp/gmp-5.0.1'
gmake: *** [all] Error 2

我不熟悉C++ make。我是否需要指定任何标志来通知 mingw_w64 我正在为 64 位构建?谢谢。

4

5 回答 5

12

对我来说,gmp 是为 x86 成功构建的,而我在构建 x64 时遇到了问题。问题如下:

在 mpn\fib_table.c 中:

#if GMP_NUMB_BITS != 32
Error, error, this data is for 32 bits
#endif

在 gmp.h 中:

#define GMP_LIMB_BITS                      64
#define GMP_NAIL_BITS                      0
#define GMP_NUMB_BITS     (GMP_LIMB_BITS - GMP_NAIL_BITS)

fib_table.c是gen-fix.exe工具生成的,这个工具是make生成的。

所以,如果有人在构建 x86 之后尝试构建 x64 构建(像我一样),首先运行“make clean”是不够的。运行“make clean”后删除gmp根文件夹中的所有“gen-*.exe”文件,这些文件将被make正确重建。之后为我成功构建了 gmp x64。

在 gmp 6.0.0 上测试。

于 2014-07-11T06:08:35.500 回答
11

我如何为 Windows 构建动态 dll gmp-6.1.2,以便可以为 Visual Studio 项目链接 dll。

设置环境

  • 安装 7-Zip
  • 安装Cygwin,默认安装添加如下包
    • gcc核心
    • gcc-g++
    • libgcc
    • m4
    • 制作
    • 制作
    • 重击
  • 将以下环境变量添加到用户 PATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\Hostx64\x64
    • 这样您就可以使用该lib命令了。您lib.exe可能位于其他地方。

建立GMP

  • 从https://gmplib.org/#DOWNLOAD下载 tar.bz2 版本并使用 7-zip 解压 gmp-6.1.2 文件夹。
  • bash.exe从启动C:\cygwin64\bin
  • 将目录更改为解压缩的 gmp-6.1.2 文件夹。前任:cd "A:\Code\gmp-6.1.2"
  • 执行./configure --disable-static --enable-shared
  • 执行make
    • 这将创建cyggmp-10.dllA:\Code\gmp-6.1.2\.libs\
  • 执行make check
  • 执行cd ./libs
  • 执行lib /machine:i386 /def:cyggmp-10.dll
    • 这将生成cyggmp-10.expcyggmp-10.lib用于A:\Code\gmp-6.1.2\.libs\视觉工作室

您现在拥有从 C# 代码调用 gmp 所需的一切。

于 2018-08-30T17:29:01.793 回答
8

请参阅http://gladman.plushost.co.uk/oldsite/computing/gmp4win.php,并注意本段;

但是,GMP 不能在 Windows 上提供高性能的 64 位库,因为它的 64 位汇编代码与 Windows x64 调用约定不兼容。这意味着与 MPIR 相比,Windows 上的 64 位 GMP 库非常慢,MPIR 具有出色的 64 位汇编器支持。

因此,您要么禁用组装,./configure --disable-assembly要么使用MPIR

于 2011-01-17T15:36:08.520 回答
7

您可能想看看MPIR。它是原生支持 Visual Studio 的 GMP 的一个分支。

于 2011-01-17T15:31:40.493 回答
6

我尝试了以下方法。该库可以成功构建。

./configure --prefix=/d/Temp/gmp-5.0.1-install --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --disable-static --enable-shared
于 2011-01-19T02:29:19.677 回答