Gcc 使用ffmpeg库时发生编译错误

Gcc 使用ffmpeg库时发生编译错误,gcc,architecture,compilation,ffmpeg,Gcc,Architecture,Compilation,Ffmpeg,我已经下载并安装了ffmpeg库。我想用它来读取不同视频的独立帧并对其进行操作。为此,我尝试从这里学习一些教程: 但是我无法编译我的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 arc

我已经下载并安装了ffmpeg库。我想用它来读取不同视频的独立帧并对其进行操作。为此,我尝试从这里学习一些教程: 但是我无法编译我的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选项。 我使用OSX Mountain Lion 10.8.2和gcc 4.2编译器。 有人知道这个错误的原因吗? 提前谢谢

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

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

最后,我设法编译了使用ffmpeg库的程序

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

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

g++ readVideo.cc -o readVideo $(pkg-config --libs --cflags libavformat)
pkg config
这里有一个实用程序,它打印正确链接指定的
libavformat
库所需的所有标志和库

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

extern "C" {
  #include <libavformat/avformat.h>
}
要安装共享库,您需要在安装ffmpeg时将以下两个选项添加到
/configure
程序中:

--disable-static --enable-shared

希望有一天它能帮助别人…

我试图通过-libavformat链接所需的库,并指出静态库文件的确切路径,还尝试了动态库,但它总是给我相同的错误。好吧,也许这个额外的参数
arch=x86_64
就是罪魁祸首。再次尝试构建,这次运行./configure而不使用它。不要忘了在开始之前做
清理
。一般来说,configure会检测您当前的架构,所以您不需要指定它。我尝试过在没有arch选项的情况下重新安装ffmpeg,但仍然没有效果。有没有办法检查编译器是否真的链接了libavformat.a库文件?因为我用
#include
将它包含在源文件中,并且这个头文件包含有问题的函数:
av\u register\u all()
。我已经告诉过你,仅仅包含头是不够的。如果只包含标题而不链接到*.a文件,则会得到与您得到的错误完全相同的错误。链接不是由编译器完成的,而是由链接器(一个单独的工具)完成的。编译时使用的命令是什么?
gcc readVideo.C-L/usr/local/lib-lavformat
gcc readVideo.C/usr/local/lib/libavformat.a
--disable-static --enable-shared