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 <mpir.h>改爲#include <gmp/mpir.h>)
我的.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 <stdio.h>
#include <gmp/mpir.h>

#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);
}

結果:

程序測試:(C++語言)

#include <iostream>
#include <iomanip>
using namespace std;

#pragma warning(disable: 4800)
#include <gmp/mpirxx.h>
#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;
}

結果:


另外我也用另一個方式嘗試使用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

發佈了70 篇原創文章 · 獲贊 18 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章