ffmpeg - проблема компиляции с g ++ - PullRequest
2 голосов
/ 22 сентября 2011

Я пытаюсь запустить программу, которая использует библиотеки ffmpeg для декодирования mp3-файлов. Я использую следующие опции для компиляции программы:

g++ -c play.cpp -o play.o
g++ -o play play.o -L/usr/local/lib -lavutil -lavcodec -lavformat -lavdevice \
                   -lavfilter -ldl -lasound -L/usr/lib -lSDL -lpthread -lz -lswscale -lm

Но при линковке я получаю следующие ошибки:

play.cpp:(.text+0x49): undefined reference to `av_dup_packet(AVPacket*)'
play.cpp:(.text+0x66): undefined reference to `av_malloc(unsigned int)'
play.cpp:(.text+0x324): undefined reference to `avcodec_decode_audio3(AVCodecContext*, short*, int*, AVPacket*)'
play.cpp:(.text+0x387): undefined reference to `av_free_packet(AVPacket*)'

и так далее ... Эти сообщаемые функции доступны в libavcodec.a и т. Д., Которые я уже указал с опциями ссылки. Может кто-нибудь сказать мне, что может быть не так, или предложить, как подойти к отладке этого?

Ответы [ 2 ]

8 голосов
/ 22 сентября 2011

Это ваша собственная программа, а не стандартный пример libav? Я могу ошибаться, но если это так, вы, вероятно, можете забыть указать extern "C", включая заголовки libav:

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

Это может быть проблемой, потому что вы пытаетесь скомпилировать исходники с помощью компилятора C ++, а libav (ffmpeg) компилируется с помощью компилятора C, поэтому вы должны пометить заголовки include для библиотеки как скомпилированные компилятором C с использованием extern C.

Если вы уже пометили include как extern C, пожалуйста, опубликуйте фрагмент кода из вашей программы, чтобы посмотреть на него.

1 голос
/ 22 сентября 2011

Убедитесь, что с помощью подробного linkin (-Wl,--verbose) выбрана правильная версия -lavcodec, и проверьте с помощью objdump или ldd, действительно ли символы находятся в библиотеке.

Вы можете попробовать изменить порядок флагов -l, это очень важно; однако, поскольку play.cpp содержит ссылки на функции в -lavcodec, порядок флагов уже должен быть правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...