華為雲openEuler(鯤鵬)安裝gmp踩坑
這里下載.xz的包而非.lz的包(后者要求lzip,yum中不包含,需下載源碼編譯安裝)
當前最新版本的gmp是gmp-6.2.1,故在命令行中執行以下代碼:
curl -O https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz
解壓:
tar -xvJf gmp-6.2.1.tar.xz
進入gmp文件夾,使用configure生成makefile:
cd gmp-6.2.1
./configure -enable-cxx
其中-enable-cxx表示啟用c++支持(gmp默認不開啟)
configure 的部分參數如下:
--prefix
指定安裝目錄,若不指定,默認為/usr/local --disable-shared 禁用動態庫,默認開啟
--disable-shared 禁用靜態庫,默認開啟
然后編譯安裝:
make
make install
編譯完成后,編寫測試代碼(c++)如下:
#include <iostream>
#include "gmpxx.h"
//gmp為c++提供的頭文件,c程序不用加
#include "gmp.h"
//gmp為c語言提供的頭文件,c++程序可以不要
int main(){
std::string a,b;
std::getline(std::cin,a);//從輸入中讀入一行
std::getline(std::cin,b);
mpz_class ga(a);
//構造函數,使用String類型轉換為gmp內置的大數類型
mpz_class gb(b);
std::cout << "a*b="<<ga*gb <<std::endl;
//gmp對c++的支持,操作符重載,允許直接用乘法代替mpz_mul,返回值類型為mpz_t,同樣對於輸出iostream <<也有重載。
std::cout << "gcd(a,b)="<<gcd(ga,gb) <<std::endl;
return 0;
}
//從對c++特性的支持上來說,gmp比openssl強多了(
使用以下參數編譯並運行:
g++ <filename>.cpp -lgmp -lgmpxx -o <outfile> && ./<outfile>
輸入以下測試數據
123456789987654321
987654321123456789
結果:
a*b=121932632103337905662094193112635269
gcd(a,b)=1222222221
可能出現的問題:
1.編譯時出現缺少m4的問題
使用yum install -y m4 安裝,重新編譯即可
2.(c++程序)編譯后運行時的鏈接庫問題,表現如下:
[filename]:error while loading shared libraries: libgmpxx.so.4: cannot open shared object file: No such
file or directory
使用ldd查看文件鏈接庫的狀態如下:
# ldd testgmp
linux-vdso.so.1 (0x0000ffff2a020000)
libgmp.so.10 => /lib64/libgmp.so.10 (0x0000ffff29f70000)
libgmpxx.so.4 => not found
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x0000ffff29dc0000)
libm.so.6 => /lib64/libm.so.6 (0x0000ffff29cf0000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000ffff29cb0000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffff29b20000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff2a030000)
可以看到找不到libgmpxx.so.4
解決方法:在~/.bash_profile文件尾插入以下語句
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
若使用了configure指定了其他安裝目錄<path>
,則使用<path>
替換上面的默認路徑的/usr/local
部分
然后在終端中輸入
source ~/.bash_profile