Pergunta

I am working on a project where I have to create a simple C program that makes use of libavformat to convert a file from one format to another.

I am working on OS X (10.8.3) and have installed libav through the following steps.

First, install dependancies using Homebrew:

brew install yasm zlib faac lame speex libogg libvorbis theora libvpx x264
XviD openjpeg opencore-amr freetype

Next, download libav from here: http://libav.org/download.html (using the libav 9 "plain 9" release)

Finally, configure with the following commands:

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

Everything compiles correctly and gives a list of supported codecs, encoders, decoders, muxers, demuxers, etc.

I then run make && sudo make install.

However, once I try to make use of av_register_all() and some other critical functions in my own C code, I get the following error:

Undefined symbols for architecture x86_64:
  "_av_register_all", referenced from:
      _main in base-bPKLay.o

I have tried compiling it using gcc -Wall base.c -o base as well as clang -Wall base.c -o base, but both give the above error. I fear that something is wrong with how the libraries are linked, but I am not experienced enough with C programming in general to know where to look next. The C code itself compiles fine when I remove the av_register_all() call.

The include for libavformat looks like this: #include "libavformat/avformat.h"

Any help is appreciated. I have tried adding -arch x86_64 to the CFLAGS export, but it made no difference.

Foi útil?

Solução

The undefined symbols error occur because you do not tell the linker to link against libav.

Try using gcc -Wall -o base -lav base.c. The -l flag tells the linker to use the libav library.

Note that the lib part is left out when using the -l flag!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top