libav - неопределенная ссылка на 'av_frame_alloc' и т.д.

Я пытаюсь скомпилировать этот учебник из документа libav: ссылка

Я ничего не менял в коде!

Но когда я компилирую его с помощью:

gcc test.c -lavformat -lswscale -lavdevice -lavformat -lavcodec -lavutil -lpthread -lm -o example

Я получаю эти ошибки:

undefined reference to `check_sample_fmt'
undefined reference to `select_sample_rate'
undefined reference to `select_channel_layout'
undefined reference to `av_frame_alloc'
undefined reference to `av_frame_free'

Поискав в Dr.google, я прочитал, что это может быть как-то связано с порядком связывания библиотек. Но я еще не нашел правильный?!

РЕДАКТИРОВАТЬ: этот «возможный дубликат», похоже, не связан с моей проблемой


person IIIIIIIIIIIIIIIIIIIIII    schedule 14.08.2015    source источник
comment
Спасибо Dayal, я уже видел эту тему! Но не думайте, что это связано с моей проблемой   -  person IIIIIIIIIIIIIIIIIIIIII    schedule 14.08.2015
comment
Я также попробовал это в следующем порядке: gcc -o пример test.c -lavformat -lavcodec -lavutil -lswscale -lfdk-aac -lao -lavdevice -lavresample -lpthread -lm Теперь у меня есть только неопределенная ссылка на 'av_frame_alloc и av_frame_free'   -  person IIIIIIIIIIIIIIIIIIIIII    schedule 14.08.2015
comment
Вы уверены, что вам нужно связать все эти библиотеки? Этот пример программы отлично скомпилировался для меня всего лишь gcc test.c -lavutil -lm -lavcodec -o example   -  person szx    schedule 14.08.2015
comment
Спасибо @szx, к сожалению, я все еще получаю некоторые неопределенные ссылки. Может быть, это может помочь. Я использую libav(11.4) с ./configure --disable-shared --enable-static. Я скопировал пример кода для «аудиодекодирования» из примера в папке с документами. Это более новая версия примера, который я опубликовал (я только что смог найти этот старый в Интернете)   -  person IIIIIIIIIIIIIIIIIIIIII    schedule 14.08.2015


Ответы (3)


Вероятно, вы используете старый код с более новой версией FFmpeg. Ffmpeg изменил имена некоторых функций, некоторые из них создают некоторые устаревшие предупреждения, а другие создают ошибки.

Согласно официальному Ffmpeg github:

av_frame_alloc(), av_frame_unref() and av_frame_free() now can and should be 
used instead of avcodec_alloc_frame(), avcodec_get_frame_defaults() and avcodec_free_frame() respectively
person Lei Huayi    schedule 13.09.2018

ffmpeg поставляется с Makefile для примеров. Я взял этот и просто использовал его для своих примеров libav. Ссылка

person IIIIIIIIIIIIIIIIIIIIII    schedule 17.08.2015

Это не относится к вашему случаю, но вы получите аналогичную проблему, если попытаетесь использовать ffmpeg из C++.

#include <libavcodec/avcodec.h>

int main() {
  av_frame_alloc();
}

К сожалению, заголовки ffmpeg не имеют подходящих оболочек extern "C" {, поэтому вам придется сделать это самостоятельно.

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

int main() {
  av_frame_alloc();
}
person Timmmm    schedule 24.07.2021