未定义的符号,尽管已在链接库 (CUDA 10.1) 中定义
Undefined symbol, despite being defined in linked library (CUDA 10.1)
我有一个库 my_lib.so
,它链接到几个 CUDA 10.1 库,包括 libnppicc.so
。
运行 ldd
在库上输出以下内容 - 所有依赖项都已正确解析:
12:51:45 ~/ $ ldd my_lib.so
linux-vdso.so.1 (0x00007fffc5183000)
libopenblas.so.0 => /usr/lib/x86_64-linux-gnu/libopenblas.so.0 (0x00007f8bdbb00000)
librt.so.1 => /usr/lib/x86_64-linux-gnu/librt.so.1 (0x00007f8bdbaf6000)
libomp.so => /usr/lib/llvm-7/lib/libomp.so (0x00007f8bdba0d000)
libpthread.so.0 => /usr/lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8bdb9ec000)
libcudnn.so.7 => /usr/lib/x86_64-linux-gnu/libcudnn.so.7 (0x00007f8bc5100000)
libdl.so.2 => /usr/lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8bc50f9000)
libcudart.so.10.1 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudart.so.10.1 (0x00007f8bc4e33000)
libcublas.so.10 => /usr/lib/x86_64-linux-gnu/libcublas.so.10 (0x00007f8bc1098000)
libcufft.so.10 => /usr/local/cuda/lib64/libcufft.so.10 (0x00007f8bb2d34000)
libcusolver.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcusolver.so.10 (0x00007f8ba8229000)
libcurand.so.10 => /usr/local/cuda/lib64/libcurand.so.10 (0x00007f8ba32f9000)
libnppicc.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppicc.so.10 (0x00007f8ba2cba000)
libnppial.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppial.so.10 (0x00007f8ba1f67000)
libnppist.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppist.so.10 (0x00007f8ba0b11000)
libnppidei.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppidei.so.10 (0x00007f8ba0121000)
libnppig.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppig.so.10 (0x00007f8b9e64f000)
libnppitc.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppitc.so.10 (0x00007f8b9e165000)
libnpps.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnpps.so.10 (0x00007f8b9d6de000)
libnvToolsExt.so.1 => /usr/local/cuda/lib64/libnvToolsExt.so.1 (0x00007f8b9d4d5000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8b9d351000)
libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x00007f8b9d1ce000)
libmvec.so.1 => /usr/lib/x86_64-linux-gnu/libmvec.so.1 (0x00007f8b9d1a2000)
libgcc_s.so.1 => /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8b9d188000)
libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9cfc5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8c3990d000)
libgfortran.so.5 => /usr/lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007f8b9cd57000)
libcublasLt.so.10 => /usr/lib/x86_64-linux-gnu/libcublasLt.so.10 (0x00007f8b9aeb3000)
libnppc.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppc.so.10 (0x00007f8b9ac38000)
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f8b9abf4000)
libz.so.1 => /usr/lib/x86_64-linux-gnu/libz.so.1 (0x00007f8b9a9d6000)
接下来,我有一个 python 绑定库,它正确链接到这个共享库 lib_tf.so
。
当我尝试 运行 一个导入 python 模块的简单 python 程序时,出现以下错误:
Traceback (most recent call last):
File "test.py", line 8, in <module>
import myLib
ImportError: /home/Jim/my_python_bindings_lib.cpython-37m-x86_64-linux-gnu.so: undefined symbol: nppiGammaInv_8u_C3IR
所以我们得到一个未定义的符号错误 nppiGammaInv_8u_C3IR
。
奇怪的是这个符号是在被链接的libnppicc.so
中定义的。
我们可以通过 运行ning nm
:
确认情况是否如此
12:51:53 ~/$ nm -D /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppicc.so.10 | gr
ep nppiGammaInv_8u_C3IR
0000000000090590 T nppiGammaInv_8u_C3IR
00000000000907b0 T nppiGammaInv_8u_C3IR_Ctx
当符号有定义时,为什么我会收到此错误?
奇怪的是,当我 运行 在其他安装了 CUDA 10.1 的机器上使用相同的测试脚本和库时,它工作正常。所以这台特定机器有问题,但我不知道是什么。我也在这台机器上安装了 cuda 11.1,不确定是否相关。
编辑
有人建议我也在 python 绑定库上 运行 ldd
,所以这里是:
09:49:10 ~/ $ ldd my_python_bindings_lib.cpython-37m-x86_64-linux-gnu.so
linux-vdso.so.1 (0x00007ffd3f79c000)
my_lib.so => /home/Jim/my_lib.so (0x00007f5a522f4000)
libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f5a522c3000)
libpthread.so.0 => /usr/lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5a522a2000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5a5211e000)
libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x00007f5a51f9b000)
libgcc_s.so.1 => /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5a51f7f000)
libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x00007f5a51dbe000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5ab0bd0000)
libopenblas.so.0 => /usr/lib/x86_64-linux-gnu/libopenblas.so.0 (0x00007f5a4fbda000)
librt.so.1 => /usr/lib/x86_64-linux-gnu/librt.so.1 (0x00007f5a4fbd0000)
libomp.so => /usr/lib/llvm-7/lib/libomp.so (0x00007f5a4fae7000)
libcudnn.so.7 => /usr/lib/x86_64-linux-gnu/libcudnn.so.7 (0x00007f5a391fb000)
libdl.so.2 => /usr/lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5a391f4000)
libcudart.so.10.1 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudart.so.10.1 (0x00007f5a38f2e000)
libcublas.so.10 => /usr/lib/x86_64-linux-gnu/libcublas.so.10 (0x00007f5a35193000)
libcufft.so.10 => /usr/local/cuda/lib64/libcufft.so.10 (0x00007f5a26e2f000)
libcusolver.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcusolver.so.10 (0x00007f5a1c324000)
libcurand.so.10 => /usr/local/cuda/lib64/libcurand.so.10 (0x00007f5a173f2000)
libnvToolsExt.so.1 => /usr/local/cuda/lib64/libnvToolsExt.so.1 (0x00007f5a171e9000)
libgfortran.so.5 => /usr/lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007f5a16f7b000)
libcublasLt.so.10 => /usr/lib/x86_64-linux-gnu/libcublasLt.so.10 (0x00007f5a150d7000)
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f5a15093000)
libz.so.1 => /usr/lib/x86_64-linux-gnu/libz.so.1 (0x00007f5a14e75000)
您正在导入一个 Python 模块,它依赖于 my_python_bindings_lib.cpython-37m-x86_64-linux-gnu.so
。
那个图书馆:
- 具有未解析的符号
nppiGammaInv_8u_C3IR
(在 libnppicc
中定义),并且
- 不取决于
libnppicc.so.10
定义符号的位置。
极有可能 my_python_bindings_lib
应该 依赖于 libnppicc
(因为它使用在那里定义的符号),并且添加该依赖性将修复你的 import
问题。
我有一个库 my_lib.so
,它链接到几个 CUDA 10.1 库,包括 libnppicc.so
。
运行 ldd
在库上输出以下内容 - 所有依赖项都已正确解析:
12:51:45 ~/ $ ldd my_lib.so
linux-vdso.so.1 (0x00007fffc5183000)
libopenblas.so.0 => /usr/lib/x86_64-linux-gnu/libopenblas.so.0 (0x00007f8bdbb00000)
librt.so.1 => /usr/lib/x86_64-linux-gnu/librt.so.1 (0x00007f8bdbaf6000)
libomp.so => /usr/lib/llvm-7/lib/libomp.so (0x00007f8bdba0d000)
libpthread.so.0 => /usr/lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8bdb9ec000)
libcudnn.so.7 => /usr/lib/x86_64-linux-gnu/libcudnn.so.7 (0x00007f8bc5100000)
libdl.so.2 => /usr/lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8bc50f9000)
libcudart.so.10.1 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudart.so.10.1 (0x00007f8bc4e33000)
libcublas.so.10 => /usr/lib/x86_64-linux-gnu/libcublas.so.10 (0x00007f8bc1098000)
libcufft.so.10 => /usr/local/cuda/lib64/libcufft.so.10 (0x00007f8bb2d34000)
libcusolver.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcusolver.so.10 (0x00007f8ba8229000)
libcurand.so.10 => /usr/local/cuda/lib64/libcurand.so.10 (0x00007f8ba32f9000)
libnppicc.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppicc.so.10 (0x00007f8ba2cba000)
libnppial.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppial.so.10 (0x00007f8ba1f67000)
libnppist.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppist.so.10 (0x00007f8ba0b11000)
libnppidei.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppidei.so.10 (0x00007f8ba0121000)
libnppig.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppig.so.10 (0x00007f8b9e64f000)
libnppitc.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppitc.so.10 (0x00007f8b9e165000)
libnpps.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnpps.so.10 (0x00007f8b9d6de000)
libnvToolsExt.so.1 => /usr/local/cuda/lib64/libnvToolsExt.so.1 (0x00007f8b9d4d5000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8b9d351000)
libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x00007f8b9d1ce000)
libmvec.so.1 => /usr/lib/x86_64-linux-gnu/libmvec.so.1 (0x00007f8b9d1a2000)
libgcc_s.so.1 => /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8b9d188000)
libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9cfc5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8c3990d000)
libgfortran.so.5 => /usr/lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007f8b9cd57000)
libcublasLt.so.10 => /usr/lib/x86_64-linux-gnu/libcublasLt.so.10 (0x00007f8b9aeb3000)
libnppc.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppc.so.10 (0x00007f8b9ac38000)
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f8b9abf4000)
libz.so.1 => /usr/lib/x86_64-linux-gnu/libz.so.1 (0x00007f8b9a9d6000)
接下来,我有一个 python 绑定库,它正确链接到这个共享库 lib_tf.so
。
当我尝试 运行 一个导入 python 模块的简单 python 程序时,出现以下错误:
Traceback (most recent call last):
File "test.py", line 8, in <module>
import myLib
ImportError: /home/Jim/my_python_bindings_lib.cpython-37m-x86_64-linux-gnu.so: undefined symbol: nppiGammaInv_8u_C3IR
所以我们得到一个未定义的符号错误 nppiGammaInv_8u_C3IR
。
奇怪的是这个符号是在被链接的libnppicc.so
中定义的。
我们可以通过 运行ning nm
:
12:51:53 ~/$ nm -D /usr/local/cuda-10.1/targets/x86_64-linux/lib/libnppicc.so.10 | gr
ep nppiGammaInv_8u_C3IR
0000000000090590 T nppiGammaInv_8u_C3IR
00000000000907b0 T nppiGammaInv_8u_C3IR_Ctx
当符号有定义时,为什么我会收到此错误? 奇怪的是,当我 运行 在其他安装了 CUDA 10.1 的机器上使用相同的测试脚本和库时,它工作正常。所以这台特定机器有问题,但我不知道是什么。我也在这台机器上安装了 cuda 11.1,不确定是否相关。
编辑
有人建议我也在 python 绑定库上 运行 ldd
,所以这里是:
09:49:10 ~/ $ ldd my_python_bindings_lib.cpython-37m-x86_64-linux-gnu.so
linux-vdso.so.1 (0x00007ffd3f79c000)
my_lib.so => /home/Jim/my_lib.so (0x00007f5a522f4000)
libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f5a522c3000)
libpthread.so.0 => /usr/lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5a522a2000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5a5211e000)
libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x00007f5a51f9b000)
libgcc_s.so.1 => /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5a51f7f000)
libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x00007f5a51dbe000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5ab0bd0000)
libopenblas.so.0 => /usr/lib/x86_64-linux-gnu/libopenblas.so.0 (0x00007f5a4fbda000)
librt.so.1 => /usr/lib/x86_64-linux-gnu/librt.so.1 (0x00007f5a4fbd0000)
libomp.so => /usr/lib/llvm-7/lib/libomp.so (0x00007f5a4fae7000)
libcudnn.so.7 => /usr/lib/x86_64-linux-gnu/libcudnn.so.7 (0x00007f5a391fb000)
libdl.so.2 => /usr/lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5a391f4000)
libcudart.so.10.1 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudart.so.10.1 (0x00007f5a38f2e000)
libcublas.so.10 => /usr/lib/x86_64-linux-gnu/libcublas.so.10 (0x00007f5a35193000)
libcufft.so.10 => /usr/local/cuda/lib64/libcufft.so.10 (0x00007f5a26e2f000)
libcusolver.so.10 => /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcusolver.so.10 (0x00007f5a1c324000)
libcurand.so.10 => /usr/local/cuda/lib64/libcurand.so.10 (0x00007f5a173f2000)
libnvToolsExt.so.1 => /usr/local/cuda/lib64/libnvToolsExt.so.1 (0x00007f5a171e9000)
libgfortran.so.5 => /usr/lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007f5a16f7b000)
libcublasLt.so.10 => /usr/lib/x86_64-linux-gnu/libcublasLt.so.10 (0x00007f5a150d7000)
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f5a15093000)
libz.so.1 => /usr/lib/x86_64-linux-gnu/libz.so.1 (0x00007f5a14e75000)
您正在导入一个 Python 模块,它依赖于 my_python_bindings_lib.cpython-37m-x86_64-linux-gnu.so
。
那个图书馆:
- 具有未解析的符号
nppiGammaInv_8u_C3IR
(在libnppicc
中定义),并且 - 不取决于
libnppicc.so.10
定义符号的位置。
极有可能 my_python_bindings_lib
应该 依赖于 libnppicc
(因为它使用在那里定义的符号),并且添加该依赖性将修复你的 import
问题。