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