【问题标题】:What to do if extern "C" include collides with Qt libraries?如果 extern "C" include 与 Qt 库发生冲突怎么办?
【发布时间】:2014-02-18 12:53:01
【问题描述】:

就我而言,我正在尝试使用 QtMultimedia 和 libffmpeg 作为解码器。 将 ffmpeg 导入为 extern "C",但 ffmpeg 的 AVPixelFormat 与 QVideoFrame 的 PixelFormat 冲突。

确切的错误:

'AVPixelFormat' : 不是'QVideoFrame'的成员

有人知道可能的解决方案吗?

编辑:代码部分。

第 1 部分:Qt VideoWidget Sample

第 2 部分:libffmpeg 的使用,基于 dranger tutorial

extern "C"
{
    #include <libavcodec/avcodec.h>
    #include <libavformat/avformat.h>
    #include <libswscale/swscale.h>
}

【问题讨论】:

  • 你读过这个吗:qt-project.org/wiki/Qt-In-Namespace - 听起来你可以为他们的类使用命名空间来编译 Qt,这可能会解决你的问题
  • QVideoFrame 中的枚举是“PixelFormat”。您的变量是“AVPixelFormat”。我不明白这应该如何冲突(并且错误消息并不表明它会发生冲突)。添加导致错误的代码。

标签: c++ qt namespaces ffmpeg extern


【解决方案1】:

这是由 FFmpeg 的 pixfmt.h 中的以下行引起的:

#define PixelFormat AVPixelFormat

那么你可以试试下面的技巧:

extern "C"
{
    #include <libavcodec/avcodec.h>
    #include <libavformat/avformat.h>
    #include <libswscale/swscale.h>
}

#undef PixelFormat
#include <qt headers>

【讨论】:

    【解决方案2】:

    如果标头包含 C++ 代码,则不能盲目地将标头外部“C”。即使您通过了该冲突,当您的调用尝试链接到“C”符号但 ffmpeg 库使用 C++ 链接导出它们时,您也会在链接时遇到问题。

    如果您尝试导出 C 符号,我的建议是创建一个导出 C 的包装函数,但将 C++ 调用放入库中。

    【讨论】:

    • afaik,ffmpeg 是纯 C。我现在正在尝试什么,几天前我想为 VS2013 编译 Qt。而且,正如 duselbär 所说,将尝试使用命名空间设置对其进行编译。
    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多