鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

使用KML_LAPACK库求矩阵的逆时提示缺少库文件的解决办法

问题现象描述

在使用KML中的LAPACK库求矩阵逆时,调用dpotri_函数,测试代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int main()
{
    char uplo = 'L'
    int n = 4;
    int lda = n;
    int info = 0;
    double a[] = { 231.8009,   33.9545,   9.4143,   11.1156,
       33.9495,  162.2902,   6.6684,   53.2033,
       9.4143,    6.6684,  100.322,   71.5384,
       11.1156,   53.2033,  71.5384,  106.5638 };
   dpotri_(&uplo, &n, a, &lda, &info);
}

采用协同KML_BLAS和KML_LAPACK场景下的动态编译:

gcc test.c -o test -fopenmp -I $KML_LAPACK_ROOT/include/kml-0.3.0 -L /usr/local/kml/lib -lklapack -L $ADAPT_ROOT -l:liblapack_adapt.a -L $KML_BLAS_ROOT -lkblas -lgfortran -lm -lkservice

编译不通过,提示信息如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `zgebrd_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `sgerqf_netlib_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `zunmql_netlib_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `dgelqf_netlib_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `csptrf_netlib_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `slasda_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `csytf2_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `clarfy_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `slaed2_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `chptrf_netlib_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `dlartg_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `zgebd2_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `dorgqr_netlib_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `slarfg_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `dlarfy_'
/opt/arm/gcc-12.2.0_RHEL-8/binutils_bin/ld: /usr/local/kml/lib/libklapack.so: undefined reference to `sgebd2_'

此时系统中的环境变量设置如下:

export KML_LAPACK_ROOT=/usr/local/kml/
export KML_BLAS_ROOT=/usr/local/kml/lib/kblas/omp/
export ADAPT_ROOT=/usr/local/kml/lib/kblas/omp/lapack_adapt

使用ldd命令查看libklapack.so链接依赖关系如下:

1
2
3
4
5
6
7
8
        linux-vdso.so.1 (0x0000ffff86341000)
        libachk.so => /lib/libachk.so (0x0000ffff857dc000)
        libkservice.so.2.2.0 => /usr/local/kml/lib/libkservice.so.2.2.0 (0x0000ffff857bb000)
        libc.so.6 => /lib64/libc.so.6 (0x0000ffff85635000)
        /lib/ld-linux-aarch64.so.1 (0x0000ffff86303000)
        libdl.so.2 => /lib64/libdl.so.2 (0x0000ffff85614000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000ffff855df000)
        librt.so.1 => /lib64/librt.so.1 (0x0000ffff855be000)

关键过程、根本原因分析

鲲鹏数学库的RPM包里的LAPACK不是完整的,需要结合开源的Netlib LAPACK才能构建完整的LAPACK。上述问题的出现是没有结合开源的Netlib LAPACK未生成完整的LAPACK所致。

结论、解决方案及效果

生成完整的LAPACK。详细操作步骤请参见《鲲鹏数学库 开发指南》的“生成完整的LAPACK”章节。