【发布时间】: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没有列出版本信息