VS2008利用MPIR使用GMP

这是国外牛人写的篇文章:How to Install and Run GMP on Windows Using MPIR 
链接:http://www.exploringbinary.com/how-to-install-and-run-gmp-on-windows-using-mpir/

在这里写道http://hi.baidu.com/yibobin/blog/item/c59f5a50213b317e843524da.html
GMP on Microsoft Windows
MPIR exists in part because Torbjörn Granlund, the GMP maintainer, refuses to support Microsoft Visual Studio build capabilities for GMP. Although MPIR is the obvious choice on Windows, people who still wish to use GMP do have several options

首先,
在http://www.mpir.org/#release下载MPIR 2.2.1 released版本,我下载了最新的MPIR 2.4.0 released版本,但是用VS2008打开没有反应,所以推荐含有vc9.0 build的2.2.1最后一个版本。(很奇怪啊!)

然后
解压打开D:\mpir-2.2.1\yasm\Mkfiles\vc9,打开yasm.sln然后build一下,在D:\mpir-2.2.1\yasm\Mkfiles\vc9\Win32\Debug下生成了vsyasm.exe,yasm.exe,ytasm.exe三个可执行文件,索性将它们都复制到VS2008安装文件的Microsoft Visual Studio 9.0\VC\bin下,再将D:\mpir-2.2.1\yasm\Mkfiles\vc9下或者D:\mpir-2.2.1\build.vc9下的(我不知道他们有什么区别,但是我选择的前者,而且比后者大4kb)yasm.rules文件复制到Microsoft Visual Studio 9.0\VC\VCProjectDefaults文件夹下。

最后,
打开D:\mpir-2.2.1\build.vc9下的mpir.sln,你可以选择debug或者release方式,我分别都选用了(至于为什么选用后面讲说明)。我分别build了lib_mpir_p4和dll_mpir_p4(这个p4是指MPIR library using Pentium IV assembler)。顺便我也build了lib_mpir_cxx(这是C++版本)。

前面的步骤都完成了,现在我们开始拷文件:
打开D:\mpir-2.2.1\build.vc9下的dll和lib文件夹:或者打开你编译的解决方案文件夹也行。
现在你有debug和release两个版本,(选择这两个版本是因为我都想用,如果简便只需要编译一个release即可)
(1)只要将D:\mpir-2.2.1\build.vc9\lib\Win32\Release下.h文件都拷贝到Microsoft Visual Studio 9.0\VC\include\gmp下(gmp这个文件夹是我自己新建的,以后引用头文件要加上这个,是为了做区分,但是注意将mpirxx.h中#include 改为#include
我的.h文件有config.h  gmp.h  gmp-mparam.h  gmpxx.h  mpir.h  mpirxx.h(有的说只考了个mpir.h和mpirxx.h,反正都拷也不会多占多少空间)
(2)将D:\mpir-2.2.1\build.vc9\lib\Win32\Release下的.lib和.pdb文件(应该只要.lib即可)复制到Microsoft Visual Studio 9.0\VC\lib;
其文件是:mpir.lib mpir.pdb 和 mpirxx.lib mpirxx.pdb
再将D:\mpir-2.2.1\build.vc9\lib\Win32\Debug下的上述lib和pdb文件改为mpird.lib mpird.pdb 和 mpirxxd.lib mpirxxd.pdb复制到Microsoft Visual Studio 9.0\VC\lib中
(3)(可选项)如果你想程序动态链接可以将D:\mpir-2.2.1\build.vc9\dll\Win32下的Debug和Release下的文件如上方式放到VC9.0下的文件夹中,.h放在include中,.lib和.pdb放在lib下,.dll文件可以放在bin下或者system32下。(如果是编译的程序在其他机器上运行,则要将dll文件随即拷贝)


注意:如果是在debug环境下用的是mpir.lib而非mpird.lib,则需要在项目->属性->配置属性->链接器->输入->忽略默认库选/NODEFAULTLIB
或者在项目->属性->配置属性->C/C++->代码生成->运行库->选多线程而非多线程调试
因此这就是前面Debug和Release都编译的小小优势!
此外,如果是C++版本,需要同时载入mpird.lib和mpirxxd.lib。
建议:Debug模式下用入mpird.lib和mpirxxd.lib
           Release模式下用入mpir.lib和mpirxx.lib
如果习惯用dll的类似配置和使用!

当然作为编程人员要在http://www.mpir.org/#release下载一个Doucumentation

程序测试:(C语言)

#include
#include

#pragma comment(lib, "mpird.lib") // 必须,debug下用mpird.lib,也可以用其他方式添加lib

int main (int argc, char *argv[])
{
mpz_t aBigPO2;

mpz_init(aBigPO2);

mpz_set_ui(aBigPO2, 1073741824); //2^30
mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^60
mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^120
mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^240
mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^480
mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^960
mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^1920

mpz_out_str(stdout,10,aBigPO2);
printf ("\n");

mpz_clear(aBigPO2);
}

结果:
VS2008利用MPIR使用GMP_第1张图片

程序测试:(C++语言)

#include
#include
using namespace std;

#pragma warning(disable: 4800)
#include
#pragma warning(default: 4800)

#pragma comment(lib, "mpird.lib")
#pragma comment(lib, "mpirxxd.lib")

int main (int argc, char *argv[])
{
mpf_class aSmallPO2(0,4449); //Init to 0, precision 4449 bits

aSmallPO2 = 0.000000000931322574615478515625; //2^-30
aSmallPO2*=aSmallPO2; //2^-60
aSmallPO2*=aSmallPO2; //2^-120
aSmallPO2*=aSmallPO2; //2^-240
aSmallPO2*=aSmallPO2; //2^-480
aSmallPO2*=aSmallPO2; //2^-960
aSmallPO2*=aSmallPO2; //2^-1920

cout << setprecision (1343) << aSmallPO2 << endl;
}

结果:
VS2008利用MPIR使用GMP_第2张图片

另外我也用另一个方式尝试使用gmp!
下载MinGW和MSYShttp://sourceforge.net/projects/mingw/files/,然后在D:\MinGW\msys\1.0\bin下复制msys-gmp-10.dll到D盘根目录并改名为gmp.dll,再拷贝D:\MinGW\msys\1.0\local\include下gmp.h到VC9.0的include文件和下面生成的lib的放到lib文件,以及上面的dll(注意用原名称即msys-gmp-10.dll)文件放到bin,并且在系统变量path添加D:\MinGW\msys\1.0\bin。但是该种方法需要注意:如果是在debug环境下用的是mpir.lib而非mpird.lib,则需要在项目->属性->配置属性->链接器->输入->忽略默认库选/NODEFAULTLIB或者在项目->属性->配置属性->C/C++->代码生成->运行库->选多线程而非多线程调试

http://hi.baidu.com/yibobin/blog/item/c59f5a50213b317e843524da.html(引用该方法)
如下:

如果MPIR也不想用,那还有一种不赖的方法,就是从dll文件产生def文件,进而逆向,导出适于VC链接的 lib文件 。

def文件可以用VC的dumpbin工具产生,不过接着你还得转换一下格式,少不了要用正则表达来处理,我在此推荐的工具是pexports,下载地址是http://www.emmestech.com/software/pexports-0.43/download_pexports.html

$ pexports.exe gmp.dll -o >gmp.def

$ lib /def:gmp.def
Microsoft (R) Library Manager Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.

LINK : warning LNK4068: 未指定 /MACHINE;默认设置为 X86
正在创建库 gmp.lib 和对象 gmp.exp

你可能感兴趣的:(CV)