首页 > 解决方案 > 包含静态库,但在运行时仍链接到同名的动态库

问题描述

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

我在 gcc 中添加了编译选项

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 

我无法修改 LD_LIBRARY_PATH 来修改搜索顺序,因为 NvCodec 是一个静态库。

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

和想法?

谢谢你

标签: gcccudastatic-librariesdynamic-library

解决方案


正如@Robert Crovella 所说,

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

而且nvidia-384驱动库中没有cuvidGetDecodeStatus这样的符号。

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


推荐阅读