【问题标题】:undefined reference to "av_new_packet" (using Qt)未定义对“av_new_packet”的引用(使用 Qt)
【发布时间】:2015-05-14 14:43:58
【问题描述】:

我已经按照 README 和 INSTALL 说明中的说明编译了 libav。

现在我正试图在 Qt 创建者中关注这个example

我已经弄清楚如何在项目文件中包含我需要的库:

LIBS += \
/usr/local/lib/libavformat.a \
/usr/local/lib/libavutil.a

而且我需要将包含指令包装在一个外部:

extern "C" {
#include <libavformat/avformat.h>
#include <libavutil/dict.h>
}

问题在于,当我尝试编译我的 Qt 项目时,我只是从整个库中的函数中收到关于“未定义对 'av_new_packet' 的引用”的大量消息(大约 700 条左右)。

我还需要做什么才能使其正常工作?

更新:

我注意到 - 就在我的眼睛因为起得太晚而变得模糊时 - 错误出现在下载文件夹中的头文件中?这是我运行 configure 和 make 命令的文件夹,然后在我链接到的 /usr/local/lib 中生成了 libav*.a 库。这是正确的吗?如果不是,我该如何解决?

【问题讨论】:

  • 试试readelf -s /usr/local/lib/libavformat.so | grep av_new_packet,看看里面有没有定义的符号,这种情况下不建议链接静态库,也可能违反许可条款.我相信你也错过了libavcodec.a|so...
  • 它看起来像是在 libavcodec.a 中定义的(并且没有在 libavformat.a 中定义)——我将它包含在 Qt LIBS 定义中,但我仍然收到错误消息。另外 - 你必须原谅我,因为我是 C++ 的新手 - “在这种情况下”静态库有什么问题?
  • 静态库没什么问题,不是C++问题,而是法律问题。简而言之,当使用 LGPL 代码时,您的用户必须能够将您的封闭源代码与他提供的 LGPL 库重新链接。因此,当您使用静态链接时,您需要为所有闭源代码提供一个 .lib 对象,然后这些对象可以静态链接到 LGPL 库。
  • ffmpeg() 最近尝试了很多更改,因此您需要检查您的libav* 版本是否与教程中的版本兼容。另外,我说静态库不是一个好主意的另一个原因是,如果您链​​接到静态库,其中的所有代码都将与您的代码合并到一个二进制文件中,因此您可能不希望这样。要解决这个问题,只需将后缀从 .a 更改为 .so
  • 我如何检查教程的兼容性? libav.org/doxygen/master/metadata_8c-example.html没有列出版本信息

标签: c++ c qt libav


【解决方案1】:

只是答案的一部分,但我最终删除了内置源库并下载了适用于 Ubuntu 14.04 的 libav*-dev 包。

然后我可以链接到安装在的共享对象文件

 /usr/lib/x86_64-linux-gnu/libavformat.so 

 /usr/lib/x86_64-linux-gnu/libavutil.so

这消除了问题 - 可能是因为 Ubuntu 版本与我构建的版本相比更旧。

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2012-03-16
    • 2017-04-08
    相关资源
    最近更新 更多