华为云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