FFmpeg richtig einbinden
-
Hallo,
hab hier ein im Forum und auch in anderen oft Beiträge mit dem selben Problem gesehen:
Beim Compileversuch tritt der Fehler "undefined reference to `av_register_all()'"
z.B. auf.FFmpeg wurde erfoglreich kompiliert. Ich benutze Ubuntu und daher g++.
Ich habe FFmpeg erstellt mit den Befehlen:./configure
make
sudo make installIch versuche statische Bibliotheken zu benutzen von ffmpeg. Alos bzw. denke ich das, da ich nach dem Erstellen von FFmpeg *.a Dateien erhalte.
Nun habe ich keine Erfahrung mit statischen Bibliotheken und weiß nicht warum folgender Aufruf nicht klappt:
g++ -L/usr/local/lib -o"test" ./src/test.o -lavutil -lavformat -lavcodec -lavdevice -lswscale
Nach meinem Verständis sollte das ja klappen, -L bestimmt den Ordner mit allen *.a Dateien und die -l Parameter die Namen der einzelnen Bibs.
Code ist super einfach und simpel und nur dazu da, zu testen, ob die Libs gefunden werden :
#define __STDC_CONSTANT_MACROS #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <iostream> using namespace std; int main() { av_register_all(); cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! return 0; }
Werft ruhig alle Tipps die euch einfallen in den Raum! Hab schon viele Tipps von anderen Foren probiert aber genau wie die damaligen Threadersteller konnten die Tipps nie weiterhelfen. Scheint wohl ne recht knifflige Sache zu sein oder es ist eifnach und es scheitert an ein paar simplen Dingen die ich jetzt nicht kenn. Muss auch gestehen, dass ich schon 2 Jahre nicht mehr aktiv mit C++ gearbeitet habe...
Ich bin für jeden Tipp dankbar, ffmpeg scheint ein extrem gutes Framework zu sein.
Ich benutze Eclipse als IDE.
Gruß,
Chris
PS: Kann man ansonsten ffmpeg vlt auch dynamisch bauen lassen ? Das klappt bei mir meistens besser...
-
~~Die Frage ist jetzt: Willst Du mit den libs arbeiten oder willst Du einfach ffmpeg nutzen? Zu 2.: Da wird eine ffmpeg.exe mit erstellt (sollte zumindest) - die kann man nutzen.
1. Wird etwas knifflig. Erstmal musst Du die .a Dateien in dein Projekt linken. (Weis aber nicht wie das geht mit eclipse..) danach sollte der Fehler weg sein den du bekommst. Allerdings ist das nutzen von ffmpeg kein Zuckerschlecken -.-~~
Edit: Zudem sollte der Beitrag am besten in "Rund um die Programmierung" oder sowas
Edit2: Verlesen oO
Mal
gcc -o test.exe api-example.c -l avcodec -l avdevice -l avformat
Getestet?
-
Mit C++ hat deine Frage nichts zu tun, daher falsches Forum.
Bei statischen Libs kommt es auf die Reihenfolge an. Es wird immer nur das gebunden, was gerade gesucht wird. Ein Symbol in einer Lib, das erst durch eine spätere Lib gesucht wird, wird dann nicht mehr gefunden.
-
Das mit dem falschen Forum ist wahr, sorry dafür.
make all
Building target: test
Invoking: GCC C++ Linker
g++ -static -L/usr/local/lib -o"test" ./src/test.o -lavcodec -lavdevice -lavformat
./src/test.o: In functionmain': /home/kr0e/workspace/test/Debug/../src/test.cpp:18: undefined reference to
av_register_all()'
collect2: ld returned 1 exit status
make: *** [test] Fehler 1Leider hat die Reihenfolge nichts verändert. Oder fällt dir vlt. ein anderer Fehler oben auf ?
-
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 umstellenEdit:
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 to
av_log'
/home/kr0e/Dokumente/FFmpeg/ffmpeg-0.6.1/libavformat/rtmppkt.c:369: undefined reference toav_int2dbl' /home/kr0e/Dokumente/FFmpeg/ffmpeg-0.6.1/libavformat/rtmppkt.c:369: undefined reference to
av_log'
/home/kr0e/Dokumente/FFmpeg/ffmpeg-0.6.1/libavformat/rtmppkt.c:384: undefined reference to `av_log'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 :))