我正在做一个项目,我必须创建一个简单的C程序,利用libavformat
将文件从一种格式转换为另一种格式。
我正在操作OSX(10.8.3),通过以下步骤安装了libav
。
首先,使用自制程序安装依赖项:
brew install yasm zlib faac lame speex libogg libvorbis theora libvpx x264
XviD openjpeg opencore-amr freetype
接下来,从这里下载libav:http://libav.org/download.html(使用
libav 9 "plain 9"
版本)最后,使用以下命令进行配置:
export CFLAGS="-I/usr/local/Cellar/openjpeg/1.5.1/include/openjpeg-1.5/ -I/usr/local/Cellar/lame/3.99.5/include/lame/"
./configure --enable-gpl --enable-libx264 --enable-libxvid --enable-version3
--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-nonfree
--enable-libfaac --enable-libmp3lame --enable-libspeex --enable-libvorbis
--enable-libtheora --enable-libvpx --enable-libopenjpeg --enable-libfreetype
--enable-doc --enable-gnutls --enable-shared --arch=x86_64
所有代码都能正确编译,并列出支持的编解码器、编码器、解码器、muxer、demuxer等。
然后运行
make && sudo make install
。但是,一旦我尝试在自己的C代码中使用
av_register_all()
和其他一些关键函数,就会得到以下错误:Undefined symbols for architecture x86_64:
"_av_register_all", referenced from:
_main in base-bPKLay.o
我试过使用
gcc -Wall base.c -o base
和clang -Wall base.c -o base
编译它,但都给出了上述错误。我担心这些库的链接方式有问题,但是我没有足够的C编程经验来知道下一步该看哪里。当我删除av_register_all()
调用时,C代码本身编译得很好。libavformat的include如下:
#include "libavformat/avformat.h"
如有任何帮助,我们将不胜感激。我试过将
-arch x86_64
添加到CFLAGS导出中,但没有什么不同。 最佳答案
出现未定义符号错误是因为您没有告诉链接器链接libav。
尝试使用gcc -Wall -o base -lav base.c
。-l
标志告诉链接器使用libav库。
注意,当使用-l
标志时,lib部分被省略了!