FFmpeg richtig einbinden



  • Es scheint so -- wenn man sich diese beiden Headerdateien anguckt -- als ob die FFMPEG-Autoren nicht wirklich an C++-Kompatibilität interessiert sind. Typischerweise sehen C-Header, die auch von C++-Programmen genutzt werden sollen, so aus:

    #ifndef INCLUDE_GUARD_123XYZ
    #ifndef INCLUDE_GUARD_123XYZ
    
    #include...
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    Deklarationen...
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    

    Doch ein extern "C" kann ich da nirgends finden. Du kannst ja mal probieren, diese beiden Includes in einen extern "C" Block zu setzen. Das könnte es schon gewesen sein; denn all die Funktionen und Funktionszeiger haben sonst bei einem C++-Compiler per default "C++-Linkage". Das schließt auch so Sachen wie "name mangling" mit ein und würde den Linkerfehler erklären.

    Mit anderen Worten:

    main.cpp

    #include <iostream>
    #include <ostream>
    int addiere(int,int);
    int main() {
      std::cout << addiere(17,29) << std::endl;
    }
    

    addiere.c

    int addiere(int a, int b) {
      return a+b;
    }
    

    Konsole:

    > g++ -c main.cpp
    > gcc -c addiere.c
    > g++ -o main main.o addiere.o
    main.o:main.cpp:(.text+0x1e): undefined reference to addiere(int,int)
    

    Mit extern "C":

    main.cpp

    #include <iostream>
    #include <ostream>
    extern "C" {
    int addiere(int,int);
    }
    int main() {
      std::cout << addiere(17,29) << std::endl;
    }
    
    > g++ -c main.cpp
    > g++ -o main main.o addiere.o
    

    klappt dann



  • Hm.. also da dürfte jetzt eigentlich kein Fehler mehr sein..
    Mal " ./configure --enable-memalign-hack --enable-shared " getestet? So habe ich das jedenfalls mal ans laufen bekommen - weis aber nicht mehr genau was die Parameter umstellen 😉

    Edit:
    Ach ja, ich wäre auch an ffmpeg interessiert und könnte da etwas Hilfe gebrauchen - falls Du da interesse hast ICQ Nummer steht im Profil 😃



  • Nun, auf jeden Fall kommt nun ein anderen Verhalten.

    Nun ist nicht mehr nur der undefined reference Fehler für
    av_register_all(); da... sondern 100te gleiche Fehler innerhalb
    der ffmpeg c. Dateien ?!

    Hier mal ein paar Fehlerzeilen, der Rest sieht ähnlich aus:

    /home/kr0e/Dokumente/FFmpeg/ffmpeg-0.6.1/libavformat/rtmppkt.c:415: undefined reference to av_log' /home/kr0e/Dokumente/FFmpeg/ffmpeg-0.6.1/libavformat/rtmppkt.c:372: undefined reference toav_log'
    /home/kr0e/Dokumente/FFmpeg/ffmpeg-0.6.1/libavformat/rtmppkt.c:369: undefined reference to av_int2dbl' /home/kr0e/Dokumente/FFmpeg/ffmpeg-0.6.1/libavformat/rtmppkt.c:369: undefined reference toav_log'
    /home/kr0e/Dokumente/FFmpeg/ffmpeg-0.6.1/libavformat/rtmppkt.c:384: undefined reference to `av_log'

    @cooky451:

    Gerne! Bin sehr an ffmpeg interessiert, hab das Gefühl das schwerste ist das erstmal ans Laufen zu kriegen 😃



  • Achja Cooky, --enable-shared lässt FFMpeg dynamische Libs erstellen.
    Ich habe garkeine Parameter hinter ./configure gesetzt.
    Das Default verhalten ist laut ./configure --help statische Lib Erstellung.

    Mit dynamischen könnte das klappen, aber kann ja iwo nicht sein, dass
    die statischen nicht klappen..



  • Die Lösung von krümelkacker sollte funktionieren..
    Mit reinem C (gcc) klappts auf jeden Fall auch so 😉



  • Leider nein.

    #include <iostream>
    using namespace std;
    extern "C" {
    #include <libavcodec/avcodec.h>    // required headers
    #include <libavformat/avformat.h>
    }
    int main(int argc, char**argv) {
        av_register_all();             // offending library call
        return 0;
    }
    

    Dieser Code macht 1000de undefined reference Fehler. Ich bin ratlos leider 😞



  • Hast Du mal probiert ob es mit gcc irgendwie läuft? Dann wüsste man jedenfalls schonmal sicher ob das ganze an g++ liegt.

    PS:
    Plz add @ICQ 😉



  • Ok, probier ich dann morgen mal. Hab grad keinen Nerv mehr, mit frischem Verstand gehts morgen vlt. besser von der Hand.
    Danke für die Hilfe soweit!



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Benutz am besten pkg-config:

    g++ `pkg-config libavformat libavutil libavcodec --libs --cflags` foo.c++ -o foo

    (du musst nur sicher stellen das /usr/local auch in PKG_CONFIG_PATH enthalten ist :))


Anmelden zum Antworten