c++ ffmpeg static-linking libavcodec libavformat

c++ - Referencia indefinida a avcodec_alloc_context pero ffmpeg linker order correct?



static-linking libavcodec (2)

¿Intentó llamar a avcodec_alloc_context3 en su lugar?

No encuentro ningún problema para llamar a avcodec_alloc_context3, asignar extradata y luego llamar a avcodec_open2.

También el orden de enlace debe ser -lavutil -lavformat -lavcodec

Quiero construir un ejecutable enlazado estáticamente enlazado a libavcodec y libavformat. La biblioteca ffmpeg estática se compila con:

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

Los enlazadores se establecen de la siguiente manera:

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

Al compilar, obtengo SOLO UN mensaje de error>: - /

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

Salida de 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

Incluí libavcodec.h con extern "C" {} y creo que mi orden estática es correcta. ¿Por qué obtengo este error? ¿Es porque este método ha sido desaprobado? ¿Como puedo resolver esto?

SOLUCIÓN:

No usar

avCtx = avcodec_alloc_context()

de fragmentos de código quizás más antiguos, pero use

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


si recuerdo correctamente también tuvimos problemas con esto y la solución fue que tienes que agregar específicamente libavcodec.a (junto con la ruta completa) y las otras bibliotecas estáticas de ffmpeg al paso de vinculación g ++. Ve si funciona de esta manera.

Además, el orden de las bibliotecas es importante. Ya no tengo los viejos makefiels, pero quizás recuerde que libavutil debería ser el primero en la lista.

Entonces su comando de enlace debería ser algo así como:

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