Я хочу создать статически связанный исполняемый файл, статически связанный с 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)
Вы пытались вместо этого вызвать 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