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

Gcc 包括静态库,但在运行时仍以相同的名称链接到动态库,gcc,cuda,static-libraries,dynamic-library,Gcc,Cuda,Static Libraries,Dynamic Library,我正在使用NVcodecSDK()并在我的项目中使用它的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符号实际上在NvC

我正在使用NVcodecSDK()并在我的项目中使用它的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 
我无法修改LD_LIBRARY_路径来修改搜索顺序,因为NvCodec是一个静态库

我不知道为什么它连到英伟达驱动程序库,即使我不添加链接选项(比如-LNVCVID)< /P> 你有什么想法


谢谢你

正如@Robert Crovella所说

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

nvidia-384驱动程序库中没有类似cuvidGetDecodeStatus的符号


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

正如@Robert Crovella所说

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

nvidia-384驱动程序库中没有类似cuvidGetDecodeStatus的符号


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

libnvcuvid是以何种方式实现的。静态库?仔细阅读你的链接。该页上列出的驱动程序版本要求是什么?(提示:396.xx)您安装了什么驱动程序版本?(看起来是384.xx)我试过ldd NvCodec/Lib/linux/stubs/x86_64/libnvcuvid.so,ldd说它是一个静态库。它是一个存根库,用作真实libnvcuvid的占位符。所以真实的libnvcuvid.so(由GPU驱动程序提供)是一个动态库。ok。我将尝试更新驱动程序。我对存根库一无所知。你能解释一下吗?它在一个目录树中,有
存根,这当然是一个线索。不管怎样,我想这都不是重点。您的链接操作可能成功(尽管是动态的),您面临的问题是,您正在尝试使用一个链接的可执行文件,该文件需要396.xx驱动程序,而您正在运行384.xx驱动程序。这是我的猜测。我想先把它整理一下。
libnvcuvid.so
是一个静态库吗?仔细阅读你的链接。该页上列出的驱动程序版本要求是什么?(提示:396.xx)您安装了什么驱动程序版本?(看起来是384.xx)我试过ldd NvCodec/Lib/linux/stubs/x86_64/libnvcuvid.so,ldd说它是一个静态库。它是一个存根库,用作真实libnvcuvid的占位符。所以真实的libnvcuvid.so(由GPU驱动程序提供)是一个动态库。ok。我将尝试更新驱动程序。我对存根库一无所知。你能解释一下吗?它在一个目录树中,有
存根,这当然是一个线索。不管怎样,我想这都不是重点。您的链接操作可能成功(尽管是动态的),您面临的问题是,您正在尝试使用一个链接的可执行文件,该文件需要396.xx驱动程序,而您正在运行384.xx驱动程序。这是我的猜测。我会先解决这个问题。