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的机器!