找回密码
 欢迎注册
楼主: liangbch

[分享] 在Windows下编译GMP以供VC使用

[复制链接]
发表于 2013-6-7 10:06:36 | 显示全部楼层
11# G-Spider
这么细致入微, 彻底orz了 ,
我猜<绿色蜘蛛侠>是不是已经把gmp的源代码都啃完了?
======================
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-6-26 17:27:27 | 显示全部楼层
昨天搭建了一个MinGW64 64位编译环境,搭建过程中,首先参考了如下两个文档

MinGW64位交叉编译环境的安装和使用
   http://www.tuicool.com/articles/6NBviy

Compile Graphics Magick, Boost, Botan and QT with MinGW64 under Windows 7 64.
    http://www.kineticsystem.org/?q=node/19

搭建过程中,遇到了一些麻烦,主要是这个文档中提到的包不能使用(gcc不能用)。后来参考 http://ingar.satgnu.net/devenv/mingw32/base.html,
终于在64位win7成功的安装了MinGW64.


注:
  按照文档, MinGW64应该能够交叉编译,也就是可在32位操作系统下编译成64位的应用程序,但这个文档中的包好像只能在64位环境运行,交叉编译没有搞定。


今天,在MinGW64上成功的编译出GMP6.0的64位dll,还没有使用,不知好用不好用。


下面是使用的命令
sh ./configure --prefix=/local64/dst/gmp/x86_64 --disable-static --enable-shared --enable-fat ABI=64
make
make check
make install
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-6-26 17:28:15 | 显示全部楼层
关于pexports。

pexports可在msys命令窗口中使用mingw-get来安装。
下面是我输入的命令和log,遇到一些错误,但pexports能用。

  1. $ mingw-get install pexports
  2. http://prdownloads.sourceforge.net/mingw/mingwrt-4.0.3-1-mingw32-dll.tar.lzma?download
  3. 12.79 kB / 12.79 kB     |================================================| 100%
  4. http://prdownloads.sourceforge.net/mingw/w32api-4.0.3-1-mingw32-dev.tar.lzma?download
  5. 2.21 MB / 2.21 MB       |================================================| 100%
  6. http://prdownloads.sourceforge.net/mingw/mingwrt-4.0.3-1-mingw32-dev.tar.lzma?download
  7. 686.10 kB / 686.10 kB   |================================================| 100%

  8. http://prdownloads.sourceforge.net/mingw/binutils-2.24-1-mingw32-bin.tar.xz?download
  9. 0 B / 1.83 MB           |                                                |   0%
  10. mingw-get.exe: *** ERROR *** Get package: http://prdownloads.sourceforge.net/mingw/binutils-2.24-1-mingw32-bin.tar.xz?download: download failed
  11. http://prdownloads.sourceforge.net/mingw/gcc-core-4.8.1-4-mingw32-dev.tar.lzma?download
  12. 18.84 MB / 18.84 MB     |================================================| 100%ic
  13. http://prdownloads.sourceforge.net/mingw/gcc-core-4.8.1-4-mingw32-bin.tar.lzma?download
  14. 855.15 kB / 855.15 kB   |================================================| 100%
  15. http://prdownloads.sourceforge.net/mingw/pexports-0.46-mingw32-bin.tar.xz?download
  16. 178.61 kB / 178.61 kB   |================================================| 100%
  17. http://prdownloads.sourceforge.net/mingw/pexports-0.46-mingw32-doc.tar.xz?download
  18. 4.39 kB / 4.39 kB       |================================================| 100%
  19. http://prdownloads.sourceforge.net/mingw/pexports-0.46-mingw32-lic.tar.xz?download
  20. 6.55 kB / 6.55 kB       |================================================| 100%
  21. http://prdownloads.sourceforge.net/mingw/binutils-2.24-1-mingw32-bin.tar.xz?download
  22. 0 B / 1.83 MB           |                                                |   0%
  23. mingw-get.exe: *** ERROR *** Get package: http://prdownloads.sourceforge.net/mingw/binutils-2.24-1-mingw32-bin.tar.xz?download: download failed
  24. install: libquadmath-4.8.1-4-mingw32-dll-0.tar
  25. installing libquadmath-4.8.1-4-mingw32-dll-0.tar
  26. install: libssp-4.8.1-4-mingw32-dll-0.tar
  27. installing libssp-4.8.1-4-mingw32-dll-0.tar
  28. install: mingwrt-4.0.3-1-mingw32-dll.tar.lzma
  29. installing mingwrt-4.0.3-1-mingw32-dll.tar.lzma
  30. install: w32api-4.0.3-1-mingw32-dev.tar.lzma
  31. installing w32api-4.0.3-1-mingw32-dev.tar.lzma
  32. install: mingwrt-4.0.3-1-mingw32-dev.tar.lzma
  33. installing mingwrt-4.0.3-1-mingw32-dev.tar.lzma
  34. install: binutils-2.24-1-mingw32-bin.tar.xz
  35. mingw-get.exe: *** ERROR *** required package file is not available
  36. mingw-get.exe: *** ERROR *** cannot install binutils-2.24-1-mingw32-bin.tar.xz
  37. mingw-get.exe: *** ERROR *** due to previous download failure
  38. install: gcc-core-4.8.1-4-mingw32-dev.tar.lzma
  39. installing gcc-core-4.8.1-4-mingw32-dev.tar.lzma
  40. install: gcc-core-4.8.1-4-mingw32-bin.tar.lzma
  41. installing gcc-core-4.8.1-4-mingw32-bin.tar.lzma
  42. install: pexports-0.46-mingw32-bin.tar.xz
  43. installing pexports-0.46-mingw32-bin.tar.xz
  44. install: pexports-0.46-mingw32-doc.tar.xz
  45. installing pexports-0.46-mingw32-doc.tar.xz
  46. install: pexports-0.46-mingw32-lic.tar.xz
  47. installing pexports-0.46-mingw32-lic.tar.xz
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-6-27 01:27:31 | 显示全部楼层
经过一番努力,编译出来的64位dll 可以 被VC 和 MinGW 链接,并能成功的运行。
在VC下使用的64位动态库导入库文件的创建过程,和32位的稍有不同。

其一是需要使用VC2010中的lib.exe,在我的电脑上其路径是d:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\lib.exe.运行lib.exe,显示版本信息如下

  1. Microsoft (R) Library Manager Version 10.00.30319.01
  2. Copyright (C) Microsoft Corporation.  All rights reserved.

  3. usage: LIB [options] [files]

  4.    options:

  5.       /DEF[:filename]
  6.       /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
  7.       /EXPORT:symbol
  8.       /EXTRACT:membername
  9.       /INCLUDE:symbol
  10.       /LIBPATH:dir
  11.       /LIST[:filename]
  12.       /LTCG
  13.       /MACHINE:{ARM|EBC|IA64|MIPS|MIPS16|MIPSFPU|MIPSFPU16|
  14.                 SH4|THUMB|X64|X86}
  15.       /NAME:filename
  16.       /NODEFAULTLIB[:library]
  17.       /NOLOGO
  18.       /OUT:filename
  19.       /REMOVE:membername
  20.       /SUBSYSTEM:{BOOT_APPLICATION|CONSOLE|EFI_APPLICATION|
  21.                   EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|
  22.                   NATIVE|POSIX|WINDOWS|WINDOWSCE}[,#[.##]]
  23.       /VERBOSE
  24.       /WX[:NO]
复制代码


其二是,必须使用参数 /MACHINE:X64,否则在链接时,VC总是找不到gmp函数。




使用MinGW中的gcc编译时,源文件需要包含libgmp.dll.a. 下面是一个例子。

gcc gmp_test.c lib64/libgmp.dll.a -o gmp_test.exe

libgmp.dll.a 在运行make install 被创建,放在指定目录的lib子目录,和这个文件在同一目录的还有libgmp.la,这个文件很小,是一个文件格式的文件。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-6-29 08:57:13 | 显示全部楼层
要是我,就果断用 MSYS2
安装包用ArchLinux系统下的pacman管理的。

http://sourceforge.net/projects/msys2/files/?source=navbar
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-6-29 22:30:34 | 显示全部楼层
wayne 发表于 2014-6-29 08:57
要是我,就果断用 MSYS2
安装包用ArchLinux系统下的pacman管理的。

试用了一下这个,挺不错的。
Pacman -S  mingw-w64-i686-gmp   6.0.0的版本,
Pacman -S mingw-w64-x86_64-gmp 6.0.0的版本
免去了用mingw编译的过程。
然后尝试在vc下调用。(32、64类似)
1. dumpbin C:\msys64\mingw32\bin\libgmp-10.dll编辑生成libgmp-10.def,接着用lib.exe生成libgmp-10.lib文件。
2. 取头文件C:\msys64\mingw32\include\gmp.h
3. 测试。
test api的时候正常。但gmp_version出了问题。需要把__GMP_LIBGMP_DLL  定义为1,如下。

  1. #if ! defined (__GMP_WITHIN_CONFIGURE)
  2. /* #undef _LONG_LONG_LIMB */
  3. #define __GMP_LIBGMP_DLL  1    /////////修改为1
  4. #endif
复制代码


为了:
  1. #define __GMP_DECLSPEC  __GMP_DECLSPEC_IMPORT
复制代码

  1. C:\test>gmptest.exe
  2. gmp_version=6.0.0
  3. gcd(13703703579,29012345415) = 123456789

  4. 50! =30414093201713378043612608166064768844377641568960512000000000000:
  5. in base 36:    4q7eyp9zizmtqt0648txt4fm720cc1s00000000000

  6. the 50th fibonacci number is:
  7. 12586269025

  8. Binomial number C(13703703579,50) is:
  9. 22846668830250302431236479513199364822522975305215687478104351516702478015891637
  10. 70703600366179623500768194162432677898079581129267152021695401533423899442942747
  11. 17242545601139565609076669349824314705680709198462126559406915727639941541041820
  12. 74867532302113577960713768401713233550081408594530699809931993030746113827481556
  13. 30101915884369152485932802348772391158104758203529507383994826431818959228614307
  14. 9975941045589770391072556115998313884002528

  15. 13703703579^50 =:
  16. 69486077726683000331812758309215230412934883797359560426588294139022549218964675
  17. 80885309450708521831132589954969510958219429615807349907578721220179433449966217
  18. 48382306696989343046961104312394725686535029713965226604862871144248807200831961
  19. 76203244619376083819864528325831495174248273564897279634532378880540890185744125
  20. 07649744175780535091438615069925963474977080072383849937730236025990606794720942
  21. 62027675397255488137699620308453365116116828037972332454364712106142736503723811
  22. 279165134211637273579711001

  23. pi^4+pi^5=403.42877581928389049918164273214071773002829230076041
  24. e^6      =403.42879349273512260838718054338827960589989735712920
复制代码


评分

参与人数 1威望 +6 金币 +6 贡献 +6 经验 +6 鲜花 +6 收起 理由
wayne + 6 + 6 + 6 + 6 + 6 赞一个!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-1 00:13:30 | 显示全部楼层
G-Spider 发表于 2014-6-29 22:30
试用了一下这个,挺不错的。
Pacman -S  mingw-w64-i686-gmp   6.0.0的版本,
Pacman -S mingw-w64-x86 ...


有木有兴趣写一个android版本的apk,调GMP的那种 .
我打算有空搞一搞,思路都有了,就差时间了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-1 21:13:42 | 显示全部楼层
放一下#16楼做好的32位和64位的版本。备份一下。
gmp 6.0.0 x64
gmp 6.0.0 x86

(似乎不能上传附件,给个链接了)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-11 07:53:26 | 显示全部楼层
用msys + tdm gcc 4.8.1编了一个专门给vs2010用的,主要不同是库函数和后头写的代码都是调用msvcr100或者msvcr100d,避免FILE相关函数崩溃问题,有兴趣位的可从下面连接下载试试...

http://share.weiyun.com/50f6d613c69e3f336d62b6f18549a9fe

评分

参与人数 1金币 +20 收起 理由
gxqcn + 20 首贴奖励,欢迎常来。

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-11 08:20:26 | 显示全部楼层
xiaoshunzi 发表于 2014-7-11 07:53
用msys + tdm gcc 4.8.1编了一个专门给vs2010用的,主要不同是库函数和后头写的代码都是调用msvcr100或者ms ...

重在交流。结果倒是其次的。
用gcc编译,却针对vs2010 ? 能否谈谈思路?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-3-29 20:25 , Processed in 0.053035 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表