python调用.so动态链接库,运行时报错 liblapack.so.3: undefined symbol: icamin_k

目录

        • 1. 报错
        • 2. 原因
        • 3. 尝试
        • 4. 解决

1. 报错

用python调用动态链接库,编译完全没有问题,顺利生成.so文件,但是运行python调用该库时,发生报错。

报错信息如下:

Traceback (most recent call last):
  File "py_send.py", line 14, in <module>
    sharelib = libLoad("./build/libpython2share.so")
  File "/home/aaeon/miniforge3/envs/safeguard/lib/python3.6/ctypes/__init__.py", line 426, in LoadLibrary
    return self._dlltype(name)
  File "/home/aaeon/miniforge3/envs/safeguard/lib/python3.6/ctypes/__init__.py", line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /usr/lib/aarch64-linux-gnu/liblapack.so.3: undefined symbol: icamin_k

通过阅读最后一行的报错信息OSError: /usr/lib/aarch64-linux-gnu/liblapack.so.3: undefined symbol: icamin_k,我们可以看到,是/usr/lib/aarch64-linux-gnu/liblapack.so.3中出现了未定义符号icamin_k

2. 原因

上面我们得到信息,是/usr/lib/aarch64-linux-gnu/liblapack.so.3中出现了未定义符号icamin_k导致的报错。

可以想象,我的c++程序在编译时,可能调用了/usr/lib/aarch64-linux-gnu/liblapack.so.3,并利用该动态链接库生成可执行文件,未定义符号icamin_k就是此时被带进来的。

这里,可以通过命令stat /usr/lib/aarch64-linux-gnu/liblapack.so.3看到,/usr/lib/aarch64-linux-gnu/liblapack.so.3实际上是一个指向liblapack.so的软连接。之所以报错,应该是该软连接指向了一个错误的liblapack.so,而该错误动态链接库中,包含符号icamin_k

也就是说,我们需要找到不包含符号icamin_k的动态链接库liblapack.so

3. 尝试

我们直接进入路径/usr/lib/aarch64-linux-gnu下进行查找。

  • 搜索该路径下所有名称上包含“liblapack.so”的软链接和文件,如下
sudo find ./ -type l,f -name "*liblapack.so*"

搜索结果为

./liblapack.so
./lapack/liblapack.so
./lapack/liblapack.so.3
./lapack/liblapack.so.3.7.1
./atlas/liblapack.so
./atlas/liblapack.so.3
./atlas/liblapack.so.3.10.3
./liblapack.so.3
./openblas/liblapack.so
./openblas/liblapack.so.3

可以看到,该路径下,文件夹./lapack/./atlas/./openblas/中有该软连接。

  • 搜索该路径下所有内容上包含icamin_k的文件,如下
sudo grep -rn "icamin_k"

搜索结果为

Binary file libopenblas_armv8p-r0.2.20.so matches
Binary file openblas/libblas.so.3 matches
Binary file openblas/liblapack.so.3 matches
Binary file libopenblas_armv8p-r0.2.20.a matches

可以看到,该路径下,文件夹./openblas/中的软连接包含字符icamin_k,所以我们要找的链接应该在./lapack/./atlas/中。

也就是说,我们只需要将软链接/usr/lib/aarch64-linux-gnu/liblapack.so.3更新,指向./lapack/或者./atlas/中的同名动态库就可以了。

4. 解决

参考博客《liblapack.so.3: undefined symbol: icamin_k错误及解决办法》

依次执行以下命令,

cd /usr/lib/aarch64-linux-gnu
sudo rm liblapack.so.3
sudo rm liblapack.so
sudo ln -s /usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 liblapack.so.3
sudo ln -s /usr/lib/aarch64-linux-gnu/lapack/liblapack.so.3 liblapack.so

注意,这是jetson的机器!

你可能感兴趣的:(python,linux)