目錄
- 1. 概述
- 2. 編譯
- 2.1. GCC環境
- 2.2. 編譯程序
- 3. 使用
- 3.1. 呼叫
- 3.2. 示例
- 4. 參考
1. 概述
GMP是一個開源的數學運算庫,它可以用于任意精度的數學運算,包括有符號整數、有理數和浮點數,是進行大數運算比較好的選擇,
需要說明的是,在Windows環境下編譯GMP庫不是很容易的一件事情,如果可以的話,還是找一下已經編譯好的庫檔案直接呼叫,GMP是C語言撰寫的庫,在介面方面是比較穩定的,理論上是甚至能夠做到跨語言呼叫,
2. 編譯
2.1. GCC環境
GMP庫只提供了一個Makefile檔案,這意味著需要GCC環境的支持,在Windows下使用GCC就需要MinGW了,但是MinGW是支持32位編譯的,如果要編譯64位的話,就得使用MinGW-w64了,MinGW-w64是MinGW的升級版本(MinGW已經不更新了),能夠編譯64位和32位,但是,沒錯還有但是只有MinGW-w64是沒辦法編譯Makefile檔案的,單獨的MinGW-w64環境只能自己一個個編譯鏈接源代碼,編譯Makefile檔案需要安裝msys2,msys2可以在Windows下搭建一個類linux環境,里面不僅集成了MinGW-w64,還可以包括bash、vim、gcc、make等工具包,
所以知道這里面有多繞了吧?要編譯GMP只需要下載msys2就行了,當初我可是把MinGW、MinGW-w64都下載嘗試了一遍,當然使用msys2也是有坑的,msys2的工具包需要在線下載,地址在國外的工具包下載很慢,這個時候就需要更換國內資料源才行,其中的具體的安裝程序可以參考文章結尾出的文獻[1],記得一定要安裝gcc和make,
2.2. 編譯程序
在msys2中配置好gcc和make工具包之后,啟動作業目錄下的msys2環境,在msys2安裝目錄下有msys2.exe和mingw64.exe兩個啟動入口,可以都試試,看是否支持make指令,理論上兩者都是可以使用的:
啟動msys2環境后,通過CD命令進入到GMP的源代碼目錄,依次輸入如下指令:
./configure
make
make install
就可以編譯出靜態包,如果需要動態庫,那么可以把第一條指令修改為:
./configure --disable-static --enable-shared
這里建議使用動態庫,
3. 使用
3.1. 呼叫
另外一個頭痛的問題就是mingw編譯出來的靜態庫后綴名為.a,編譯出來的動態庫的匯入庫后綴名為.dll.a,而在Windows下一般使用.lib的來作為靜態庫或者動態庫的匯入庫,好在VS中是能夠識別.a檔案作為匯入庫的,像加載.lib一樣加載dll.a即可:
#pragma comment(lib, "libgmp.dll.a")
注意使用動態庫時,單獨運行時可能會提示缺少dll,libgmp.dll還依賴了mingw中的一些運行時庫,根據提示找到相應的dll即可,
3.2. 示例
在VS環境中設定好動態庫環境,使用實體代碼如下:
#include <iostream>
#include "gmp.h"
using namespace std;
int main()
{
//計算2的1000次方
{
size_t a = 1;
for (int i = 0; i < 1000; i++)
{
a *= 2;
}
cout << "2^1000 = " << a << endl;
}
{
mpz_t a, b, c, d;
mpz_init(a);
mpz_init(b);
mpz_init(c);
mpz_init(d);
//計算2的1000次方
mpz_init_set_ui(a, 2);
mpz_pow_ui(c, a, 1000);
gmp_printf("c = %Zd\n", c);
}
//大數運算
{
mpz_t b, c, d;
mpz_init(b);
mpz_init(c);
mpz_init(d);
//計算12345678900987654321*98765432100123456789
mpz_init_set_str(b, "12345678900987654321", 10);//10進制
mpz_init_set_str(c, "98765432100123456789", 10);
mpz_mul(d, b, c);
gmp_printf("d = %Zd\n", d);
mpz_clear(b);
mpz_clear(c);
mpz_clear(d);
}
return 0;
}
以上演示了使用大數冪運算和乘法運算的程序,運行結果如下:
最后附上我編譯的GMP地址,
4. 參考
- windows搭建gcc開發環境(msys2)
- C/C++編譯器gcc的windows版本MinGW-w64安裝教程
- 如何在windows下編譯GMP軟體包
- 如何在vc中使用mingw編譯出來的動態庫和靜態庫
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/54921.html
標籤:C++
上一篇:跪求:一個線性表(a1,a2,...,an)(n>3)采用帶頭結點的單鏈表L存盤,設計一個高效演算法求中間位置的元素(即序號為【n/2】的元素)
