我已经下载并安装了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二进制文件的效果非常好。
答案 0 :(得分:9)
最后,我设法编译了使用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时将这两个选项添加到./configure
程序:
--disable-static --enable-shared
希望它能帮到某个人......
答案 1 :(得分:0)
错误意味着您没有链接到ffmpeg库。仅仅包含头文件是不够的。您还需要链接到实际的库文件。在Windows上,他们有.lib扩展名,在Linux上通常是.a扩展名,不确定Mac。