Build GMP on 64bit Windows
Asked Answered
I

6

19

I have followed the instruction on the "GMP Install Instruction for Windows Platform". I could build a 32bit version of GMP which can be used for Visual Studio.

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

Then I installed mingw_w64 and msys on another machine (which is running 64bit Windows) and rerun the commands.

./configure was run without any problem. However, when I run "make", I got the following.

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

If I used "gmake" instead, the following error was shown.

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

I am not familiar with C++ make. Do I need to specify any flag in order to notify mingw_w64 that I am building for 64bit? Thanks.

Impassible answered 17/1, 2011 at 8:44 Comment(0)
I
6

I have tried the following. The library can be built successfully.

./configure --prefix=/d/Temp/gmp-5.0.1-install --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --disable-static --enable-shared
Impassible answered 19/1, 2011 at 2:29 Comment(0)
W
14

How I built dynamic dll gmp-6.1.2 for windows so that the dll can be linked for a visual studio project.

Setup Environment

  • Install 7-Zip
  • Install Cygwin, add the following packages to the default installation
    • gcc-core
    • gcc-g++
    • libgcc
    • m4
    • make
    • cmake
    • bash
  • Add the following Environment Variable to the User PATH: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\Hostx64\x64
    • This is so you can use the lib command. Your lib.exe may be located elsewhere.

Build GMP

  • Download the tar.bz2 version from https://gmplib.org/#DOWNLOAD and extract the gmp-6.1.2 folder with 7-zip.
  • Launch bash.exe from C:\cygwin64\bin.
  • Change directory to the unzipped gmp-6.1.2 folder. Ex: cd "A:\Code\gmp-6.1.2"
  • Execute ./configure --disable-static --enable-shared
  • Execute make
    • This will create cyggmp-10.dll under A:\Code\gmp-6.1.2\.libs\
  • Execute make check
  • Execute cd ./libs
  • Execute lib /machine:i386 /def:cyggmp-10.dll
    • This will generate cyggmp-10.exp and cyggmp-10.lib under A:\Code\gmp-6.1.2\.libs\ for use with visual studio

You now have everything needed to call gmp from C# code.

Weintraub answered 30/8, 2018 at 17:29 Comment(1)
Hello, what does the lib command mean on the last step? My Bash thinks it's a system command.Fidellas
B
13

For me, gmp was successfully built for x86, and I have had problems building x64. The problem was in the following:

In mpn\fib_table.c:

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

while in 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 is generated by gen-fix.exe tool, and this tool is generated by make.

So, if one tries to build x64 build after building x86 (like me), it is not enough to run "make clean" first. Delete all "gen-*.exe" files in gmp root folder after running "make clean", this files will be rebuilt properly by make. gmp x64 was successfully build for me after that.

Tested on gmp 6.0.0.

Branching answered 11/7, 2014 at 6:8 Comment(2)
Even with a fresh clone and ./.bootstrap, for x86_64 all i can build is libgmp.a at the moment.Edva
Same with gmp-6.2.1.tzx (extra comment 'cos of SO's 5m rule).Edva
S
10

See http://gladman.plushost.co.uk/oldsite/computing/gmp4win.php , and note this paragraph;

GMP cannot, however, provide high performance 64-bit libraries on Windows because its 64-bit assembler code is incompatible with Windows x64 calling conventions. This means that 64-bit GMP libraries on WIndows are very slow when compared with MPIR, which has excellent 64-bit assembler support.

So you either disable assembly with ./configure --disable-assembly or use MPIR.

Swede answered 17/1, 2011 at 15:36 Comment(1)
NB: Since GMP 5.1.0 "The performance under M$ Windows' 64-bit ABI has been greatly improved thanks to complete assembly support." (how much so I don't know).Statant
C
7

You might want to take a look at MPIR. It is a fork of GMP that natively supports Visual Studio.

Christenechristening answered 17/1, 2011 at 15:31 Comment(0)
I
6

I have tried the following. The library can be built successfully.

./configure --prefix=/d/Temp/gmp-5.0.1-install --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --disable-static --enable-shared
Impassible answered 19/1, 2011 at 2:29 Comment(0)
G
1

It's there in the documentation, if you built for another arch before:

'make clean' is not enough.

You will need to run:

make distclean

to wipe away the arch-dependant executables that build certain tables. Note: you will need to run this before ./configure since it will also wipe Makefile files (probably) and not only object files.

Gory answered 4/3 at 22:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.