gcc - 包含静态库,但在运行时仍链接到同名的动态库
问题描述
我正在使用 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)
和想法?
谢谢你
解决方案
正如@Robert Crovella 所说,
这是一个过时的驱动程序的问题。cuda codec sdk 中的库实际上是一个存根,它指向 cuda 驱动程序共享库。
而且nvidia-384驱动库中没有cuvidGetDecodeStatus这样的符号。
将 nvidia-384 更新为 nvidia-396 后,问题解决。
推荐阅读
- facebook - 面临访问令牌时的 Facebook Graph API 超时问题
- python - 如何使用计算值在 pandas 中创建一个新列并为每一行分配特定值?
- python - 我的 HTML 页面不会打印我的 django 变量
- gitlab - 在 Gitlab CI 中结合 include 和 only:changes 关键字
- python - 使用带有子元素的 Python 将 XML 转换为 CSV
- mysql - 使用带有两个条件且没有条件的 WHERE 子句连接两个表
- python - 将子进程输出转换为请求 url
- c - 如何用位域计算结构的大小?
- elasticsearch - Solr 在 Elasticsearch 中的“加入查询域更改”
- javascript - 如何取消当前动画并立即使用鼠标事件和 requestAnimationFrame() 开始新的动画