2014-07-22 33 views
7

Statik olarak libavcodec ve libavformat ile bağlantılı statik olarak bağlantılı bir yürütülebilir dosya oluşturmak istiyorum./Avcodec_alloc_context ancak ffmpeg bağlayıcı siparişi için tanımlanmamış başvuru doğru mu?

- şu şekildedir:

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

bağlayıcıları ayarlanır: derlerken

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

, ben SADECE BİR hata mesajı> olsun statik ffmpeg kütüphanesi ile inşa edildi

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

nm /ffmpeg/myBuild/lib/libavcodec.a çıktısı | grep avcodec_alloc_context:

  U avcodec_alloc_context3 
     U avcodec_alloc_context3 
000003c0 T avcodec_alloc_context3 
     U avcodec_alloc_context3 

Ben extern "C" ile libavcodec.h dahil {} ve benim statik bağlayıcı sırası doğru olduğunu düşünüyoruz. Neden bu hatayı alıyorum? Bu yöntem kullanımdan kaldırıldı mı? Bunu Nasıl Çözebilirim?

ÇÖZÜM:

Dont belki eski bir kod parçacıkları

avCtx = avcodec_alloc_context() 

kullanın, ancak eğer doğru geri çağırmak

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

'nm /ffmpeg/myBuild/lib/libavcodec.a çıktısı nedir -lavcodec

Ayrıca bağlantı sırası -lavutil -lavformat olmalıdır | grep avcodec_alloc_context'? –

+0

Çıktıya yazı ekledim – user2212461

+0

@PaoloBonzini size bir şey anlatıyor mu? Mutlak kütüphane yolları ile ilgili – user2212461

cevap

6

yerine avcodec_alloc_context3 aradın mı:

Yani bağlama komutu gibi bir şey olmalı?

Avcodec_alloc_context3 çağrısı yaparken sorun yok, extradata ayırın ve avcodec_open2'yi arayın.

+0

harika, işe yaradı! Bu eski kod parçacığının nereden geldiğini bilmiyorum. Kullanımdan kaldırılan sürümü bir noktada kaldırdı mı? – user2212461

+1

Çalıştığını bilmek güzel. Belki de onu kaldırdılar çünkü yeni aramalarla değiştirilemezler. –

2

kullanmak da bununla ilgili sorunlar vardı ve çözüm oldu Özellikle libavcodec.a (tam yolla birlikte) ve diğer ffmpeg statik kitaplıklarını e g ++ bağlantı adımı. Bu şekilde çalışıp çalışmadığını gör. Ayrıca, kitaplıkların sırası önemlidir. Artık eski makefiellere sahip değilim, ama belki de libavutil'in listede ilk olması gerektiğini hatırlıyorum.

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

: önerilen yolunuz değil ve -Leri tam olarak aynı mı? Neyse hiçbir fark yoktu. Ve kullandığım sıra, benim durumumda doğru görünüyor. Emir bağımlılık anlamına gelmiyor ve geriye doğru okunuyor mu? – user2212461