FFmpeg richtig einbinden
-
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 toav_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 #endifDoch 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.oklappt 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 toav_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'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 :))