华为云openEuler(鲲鹏)安装gmp踩坑


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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM