Неопределенная ссылка на 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)

7

Решение

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

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

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

6

Другие решения

если я правильно помню, у нас также были проблемы с этим, и решение состояло в том, что вы должны специально добавить 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
2

По вопросам рекламы [email protected]