Неопределенная ссылка на avcodec_alloc_context, но порядок компоновщика ffmpeg правильный?

Я хочу создать статически связанный исполняемый файл, статически связанный с libavcodec и libavformat. Статическая библиотека ffmpeg была собрана с:

./configure --enable-static --enable-gpl --enable-nonfree --disable-vaapi 
     --disable-libopus --prefix=myBuild --disable-swresample

Компоновщики установлены следующим образом:

g++ -O2 -static -o myBin myBin-myBin.o someotherlibraries.a 
     -L/ffmpeg/myBuild/lib -lavformat -lavcodec -lavutil  -lrt -lm -lpthread -lz

При компиляции я получаю ТОЛЬКО ОДИН сообщение об ошибке>:-/

src/ffmpeg/myProgram.cpp:115: error: undefined reference to 'avcodec_alloc_context'

Вывод nm /ffmpeg/myBuild/lib/libavcodec.a | grep avcodec_alloc_context:

         U avcodec_alloc_context3
         U avcodec_alloc_context3
000003c0 T avcodec_alloc_context3
         U avcodec_alloc_context3

Я включаю libavcodec.h с extern "C" {}, и я считаю, что мой статический порядок компоновщика правильный. Почему я получаю эту ошибку? Это потому, что этот метод устарел? Как я могу решить это?

РЕШЕНИЕ:

Не использовать

avCtx = avcodec_alloc_context()

из, возможно, старых фрагментов кода, но используйте

codec = avcodec_find_decoder(CODEC_ID_XYZ);//for completeness but should be the same as before
avCtx = avcodec_alloc_context3(codec)

2 ответа

Решение

Вы пытались вместо этого вызвать avcodec_alloc_context3?

У меня нет проблем с вызовом avcodec_alloc_context3, выделением дополнительных данных и вызовом avcodec_open2.

Также порядок ссылки должен быть -lavutil -lavformat -lavcodec

Если я правильно помню, у нас также были проблемы с этим, и решение состояло в том, что вы должны специально добавить libavcodec.a (вместе с полным путем) и другими статическими библиотеками ffmpeg на шаге связывания g++. Посмотрим, как это работает.

Кроме того, порядок библиотек важен. У меня больше нет старых makefiels, но, может быть, я помню, что libavutil должен быть первым в списке.

Так что ваша команда компоновки должна выглядеть примерно так:

g++ -O2 -static -o myBin myBin-myBin.o someotherlibraries.a 
 /ffmpeg/myBuild/lib/libavutil.a 
 /ffmpeg/myBuild/lib/libavformat.a 
 /ffmpeg/myBuild/lib/libavcodec.a 
  -lrt -lm -lpthread -lz
Другие вопросы по тегам