【问题标题】:Compilation error using ffmpeg library使用 ffmpeg 库编译错误
【发布时间】:2012-10-05 21:59:09
【问题描述】:

我已经下载并安装了 ffmpeg 库。我想用它来读取不同视频的单独帧并进行操作。为此,我尝试从这里学习一些教程:http://dranger.com/ffmpeg/tutorial01.html 但是我无法编译我的 cpp 文件,因为我得到了以下编译:

Undefined symbols for architecture x86_64:
  "av_register_all()", referenced from:
      _main in cc9zyUBe.o
      _main in ccRz35d4.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

在安装 ffmpeg 库时,我在 ./configure 步骤中使用了 arch=x86_64 选项。 我使用 OS X Mountain Lion 10.8.2 和 gcc 4.2 编译器。 有人知道这个错误的原因是什么吗? 提前致谢。

更新: 我已经尝试了许多不同的安装选项,包括静态库、共享库、带/不带 --arch=x86_64 选项。还用自制软件安装了它,结果保持不变。无法识别库。但是,当我将 ffmpeg 二进制文件用作命令行工具时,它的效果非常好。

【问题讨论】:

    标签: gcc architecture compilation ffmpeg


    【解决方案1】:

    我终于成功地编译了我使用 ffmpeg 库的程序。

    由于某种原因,我仍然无法使用 gcc 编译器编译它,但我可以使用 g++ 编译器。

    安装静态库时,必须明确指定所有依赖项,并且这些库的链接顺序也很重要。所以这是最终编译我的程序的编译代码:

    g++ readVideo.cc -o readVideo $(pkg-config --libs --cflags libavformat)
    

    pkg-config 这里是一个实用程序,它打印正确链接指定libavformat 库所需的所有标志和库。

    另外值得一提的是,源文件已从 readVideo.C 重命名为 readVideo.cc,并且 #include 语句已使用 extern "C" 包含如下:

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

    需要它是因为 ffmpeg 是一个 C 项目,如果你没有明确声明它是 C 库,程序将无法使用 C++ 编译器进行编译。

    如果您不想打扰pkg-config 来包含 ffmpeg 库的所有依赖项,您可以使用共享库而不是静态库安装 ffmpeg。然后它将通过更简单的调用进行编译:

    g++ readVideo.cc -o readVideo -lavformat
    

    要安装共享库,需要在安装ffmpeg时将这2个选项添加到./configure程序中:

    --disable-static --enable-shared
    

    希望它对某人有所帮助...

    【讨论】:

      【解决方案2】:

      错误意味着您没有链接到 ffmpeg 库。仅仅包括头文件是不够的。您还需要链接到实际的库文件。在 Windows 上它们有 .lib 扩展名,在 Linux 上通常是 .a 扩展名,不确定 Mac。

      【讨论】:

      • 我尝试通过 -libavformat 链接所需的库,并指向静态库文件的确切路径,还尝试了动态库,但它一直给我同样的错误。
      • 好的,也许这个额外的参数arch=x86_64 是罪魁祸首。再次尝试构建,这次运行 ./configure 没有它。不要忘记之前做make distclean。一般来说,configure 无论如何都会检测到您当前的架构,因此您不需要指定它。
      • 我试过重新安装不带arch选项的ffmpeg,还是没有效果。有什么方法可以检查编译器是否真的链接了 libavformat.a 库文件?由于我将它包含在带有#include &lt;libavformat/avformat.h&gt; 的源文件中,并且此头文件包含有问题的函数:av_register_all()
      • 我已经告诉过你了,仅仅包括标题是不够的。如果您只包含标题而不链接到 *.a 文件,您将得到您所得到的错误。链接不是由编译器完成的,而是由链接器(一个单独的工具)完成的。你用来编译的命令是什么?
      • gcc readVideo.C -L/usr/local/lib -lavformatgcc readVideo.C /usr/local/lib/libavformat.a
      猜你喜欢
      • 2015-01-05
      • 2013-05-28
      • 2018-10-10
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 2014-06-02
      相关资源
      最近更新 更多