包含静态库,但在运行时仍以相同名称链接到动态库

时间:2018-08-09 01:53:52

标签: gcc cuda static-libraries dynamic-library

我正在使用nvcodec sdk(https://developer.nvidia.com/nvidia-video-codec-sdk),并在项目中使用其linux静态库。

我用

在gcc中添加了compile选项
gcc myprogram.c  NvCodec/Lib/linux/stubs/x86_64/libnvcuvid.so

但是,在运行程序时,

./bin/a.out: symbol lookup error: ./bin/a.out: undefined symbol: cuvidGetDecodeStatus

我发现cuvidGetDecodeStatus符号实际上在NvCodec / Lib / linux / stubs / x86_64 / libnvcuvid.so中。

然后

nm a.out

该符号包含在程序中。

所以我尝试了

ldd a.out

我发现它已链接到同名的nvidia驱动程序。

libnvcuvid.so.1 => /usr/lib/nvidia-384/libnvcuvid.so.1 

由于NvCodec是静态库,因此我无法修改LD_LIBRARY_PATH来修改搜索顺序。

即使我不添加链接选项(例如-lnvcuvid),我也不知道为什么将其链接到nvidia驱动程序库

有主意吗?

谢谢

1 个答案:

答案 0 :(得分:1)

如罗伯特·克罗维拉(Robert Crovella)所说,

这是过时的驱动程序的问题。 cuda编解码器sdk中的库实际上是一个存根,它指向cuda驱动程序共享库。

在nvidia-384驱动程序库中没有像cuvidGetDecodeStatus这样的符号。

将nvidia-384更新为nvidia-396后,问题得以解决。