使用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所致。