2014-07-22 10 views
7

Voglio creare un eseguibile collegato in modo statico collegato staticamente a libavcodec e libavformat. La libreria ffmpeg statica era costruire con:Riferimento non definito a avcodec_alloc_context ma l'ordine del linker ffmpeg è corretto?

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

I linker sono impostati come segue:

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

Quando si compila, ottengo SOLO messaggio di errore>: -/

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

Output di 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 

includo libavcodec.h con extern "C" {} e credo che il mio ordine linker statico è corretto. Perché ottengo questo errore? È perché questo metodo è stato deprecato? Come posso risolvere questo?

SOLUZIONE:

Non utilizzare

avCtx = avcodec_alloc_context() 

da frammenti di codice forse più anziani, ma utilizzare

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

Qual è l'output di 'nm /ffmpeg/myBuild/lib/libavcodec.a | grep avcodec_alloc_context'? –

+0

Ho aggiunto l'output al mio post – user2212461

+0

@PaoloBonzini ti dice qualcosa? – user2212461

risposta

6

Hai provato a chiamare avcodec_alloc_context3 invece?

Non ho riscontrato problemi nel chiamare avcodec_alloc_context3, allocare extradata quindi chiamare avcodec_open2.

Anche l'ordine dei collegamenti dovrebbe essere -lavformat -lavutil -lavcodec

+0

fantastico, ha funzionato !! Non so da dove ho avuto questo vecchio frammento di codice. Hanno rimosso la versione deprecata ad un certo punto? – user2212461

+1

Buono a sapersi, ha funzionato. Forse lo hanno rimosso perché non sono intercambiabili con le chiamate più recenti. –

2

se non ricordo male abbiamo anche avuto problemi con questo e la soluzione è stata che devi aggiungere in modo specifico lo libavcodec.a (insieme al percorso completo) e le altre librerie statiche ffmpeg a Passo di collegamento e g ++. Vedi se funziona in questo modo.

Inoltre, l'ordine delle librerie è importante. Non ho più i vecchi makefiels, ma forse ricordo che libavutil dovrebbe essere il primo della lista.

Così il vostro comando di collegamento dovrebbe essere qualcosa di simile:

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 
+0

per quanto riguarda i percorsi di libreria assoluti: non è il tuo modo suggerito e -L internamente esattamente lo stesso? Comunque non c'era differenza. E l'ordine che sto usando sembra essere corretto nel mio caso. L'ordine non significa la dipendenza e vengono letti all'indietro? – user2212461

Problemi correlati