2012-04-12 9 views
4

ich einen Fehler haben, wenn einer meiner C++ Programme kompilieren, nachdem die FFMPEG Bibliothek von 0,8 Update auf ‚ffmpeg Version git-2012-04-12-277f20c‘FFMPEG Undefined Verweis auf ‚avcodoec_open2‘ in C++

Der Fehler ich bekomme, wenn ich mein Programm machen, ist wie folgt:

-------- begin -------- 
Linking: Analysing_Server 
./source/Encoding_Thread.o: In function `CEncoding_Thread::do_work()': 
/home/Analyser/source/Encoding_Thread.cpp:155: undefined reference to `avcodec_open2' 
collect2: ld returned 1 exit status 
make: *** [Analysing_Server] Error 1 

Die entsprechenden Zeilen meiner Make-Datei ähnelt g läuft ++ wie folgt:

g++ test2.cpp -lavformat -lavcodec -lavutil -D__STDC_CONSTANT_MACROS 

Eine abgespeckte Version meiner relevanten CPP co de, die den Fehler wirft, ist:

#include <stdio.h> 
#include <stdint.h> 

#define LOG_OUT_STREAM_BUFF_SIZE 200000 


extern "C" { 
    /* The ffmpeg library is completely written in C, so we need to tell the C++ compiler that so it links correctly. */ 
    #include "stdint.h" 
    #include "libavcodec/avcodec.h" 
    #include "libavutil/mathematics.h" 
    #include "libswscale/swscale.h" 
    #include "libavfilter/avfilter.h" 

    int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options); 
    int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr); 
} 

uint8_t m_outbuf[2][LOG_OUT_STREAM_BUFF_SIZE]; 
unsigned int m_out_size[2]; 
unsigned int m_OutBuffer_ID[2]; 
unsigned int m_Buffer_ID; /* This is just a uniqueish stamp we give to each buffer so we can tell when they change.. */ 

AVCodecContext * m_CodecContex; 
AVCodec * m_codec; 
struct SwsContext *m_img_convert_ctx; 

unsigned char* m_DataBuff; 

int Output_Width, Output_Height; 
int Output_Bitrate; 


int main(void) { 
    //New version of FFMPEG calls this in avcodec_register_all 
    //avcodec_init(); 

    /* register all the codecs */ 
    avcodec_register_all(); 

    /* Initalise the encoder */ 
    m_codec = avcodec_find_encoder(CODEC_ID_MP2); 

    if (!m_codec) { 
    printf("Encoding codec not found\n"); 
    } 

    /* init the pointers.. */ 
    m_CodecContex = NULL; 

    /* Default values.. */ 
    Output_Width = 1600; 
    Output_Height = 1200; 
    Output_Bitrate = 600000; 

    /* Create/setup the Codec details.. */ 
    //Changed to work with new FFMPEG 
    m_CodecContex = avcodec_alloc_context3(m_codec); 
    avcodec_get_context_defaults3(m_CodecContex, m_codec); 

    /* put sample parameters */ 
    m_CodecContex->bit_rate = Output_Bitrate; 
    /* resolution must be a multiple of two */ 

    m_CodecContex->width = Output_Width; 
    m_CodecContex->height = Output_Height; 
    /* frames per second */ 
    m_CodecContex->time_base= (AVRational){1,25}; 

    m_CodecContex->gop_size = 10; /* emit one intra frame every ten frames */ 
    m_CodecContex->max_b_frames=1; 
    m_CodecContex->pix_fmt = PIX_FMT_YUV420P; /* must be YUV for encoding.. */ 


    AVDictionary * RetunedAVDic; 

    /* open it */ 
    //Changed to work with new FFMPEG 
    if (avcodec_open2(m_CodecContex, m_codec, &RetunedAVDic) < 0) { 
     printf("could not open codec"); 
    } 
} 

Leider ist das Beispiel unter ‚doc/examples/decoding_encoding.c‘, die mit FFMPEG nicht mehr kommen funktioniert, weil alle Funktionen, die es nun abgeschrieben verwendet. Mein Code basiert auf dem Beispielcode und funktionierte gut mit FFMPEG 0.8, kompiliert jedoch nicht mit der neuesten Version von FFMPEG. Ich habe einige der abgeschriebenen Funktionen zu ihren neueren Versionen geändert, aber es kompiliert noch nicht.

Weiß jemand, warum ich diesen Fehler bekomme? Oder hat jemand einen Link zu einem Beispiel wie 'doc/examples/decoding_encoding.c' mit der neuesten Version von FFMPEG?

+1

Wenn ich 'nm -D /usr/lib/libavcodec.so.52 | grep avcodec_open 'auf dem' libavcodec' installiert auf meinem System, bekomme ich die folgende Ausgabe: '00000000002e4a80 T avcodec_open' - nein' avcodec_open2'. Sind Sie sicher, dass dieses Symbol verfügbar sein soll? Benötigt es eine neuere oder ältere Version von 'libavcodec' als Sie (und ich) installiert haben? – sarnold

+0

Warum definieren Sie 'avcodec_open2()' und 'avcodec_encode_video2()' in Ihrem Code manuell, anstatt den Compiler die Deklarationen verwenden zu lassen, die sich in 'avcodec.h' befinden? –

+0

sarnold, ich war ursprünglich mit avcodec_open, aber es sagt ausdrücklich in den Kommentaren in avcodec.h stattdessen avcodec_open2 verwenden. Wenn ich versuche und avcodec_open den Code kompiliert, aber nicht in der Lage ist, den Codec zu öffnen, arbeitete er mit FFMPEG 0.8. Ich habe gerade die neueste Version von FFMPEG installiert. Ich möchte versuchen, ob ich zu einer späteren Version von FFMPEG zurückkehren kann. Remy, ich habe irgendwo gelesen, dass Sie möglicherweise Funktionen manuell definieren müssen, wenn Sie C-Bibliotheken in C++ verwenden. Wenn Sie diese beiden Codezeilen entfernen, tritt derselbe Fehler auf. – ALM865

Antwort

1

Die entsprechenden Zeilen meiner Make-Datei ähnelt g läuft ++ wie folgt:

g++ test2.cpp -lavformat -lavcodec -lavutil -D__STDC_CONSTANT_MACROS

  1. In der Programmierung Details Materie. Ihr Linkbefehl ist nicht ausreichend ähnlich dem obigen Befehl, oder es hätte funktioniert.
  2. Sie stellen wahrscheinlich Bibliotheken an der falschen Stelle auf der Verbindungslinie. Die Reihenfolge der Quellen und Bibliotheken matters.

Update:

Wenn Sie die oben in einer CPP-Datei geliefert Code zu setzen, dann laufen g ++ mit den mitgelieferten Optionen, funktioniert es nicht. Sie erhalten den Fehler "undefinierter Verweis auf` avcodec_open2 '".

Nein, tue ich nicht. Ich bekomme einen anderen Fehler (da ich gar keinen Avcodec installiert habe).

Wenn der Beispielbefehl bereits für Dich ausfällt, dann sollten Sie die Fehler liefern es erzeugt, den Fehler nicht von einem anderen Befehl, so müssten wir nicht erraten, was der andere Befehl ausgesehen haben könnte wie .

Die Reihenfolge der Bibliotheken funktionierte für FFMPEG Version 0.8, warum funktioniert es nicht mit der neuesten Version?

Wahrscheinlich, weil Sie die neuesten libavcodec54 installiert haben, aber nicht die neueste libavcodec-dev installieren.

+0

1. Wenn Sie den oben angegebenen Code in eine CPP-Datei, dann führen Sie g ++ mit den mitgelieferten Optionen, es funktioniert nicht. Sie erhalten den Fehler "undefinierter Verweis auf' avcodec_open2 '". 2. Die Reihenfolge der Bibliotheken funktionierte für FFMPEG Version 0.8, warum funktioniert es nicht mit der neuesten Version? Ich glaube, dass die Bibliotheken in der richtigen Reihenfolge sind. – ALM865