Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C/C++] Demo programma ffmpeg/libavcodec compileren faalt

Pagina: 1
Acties:
  • 104 views sinds 30-01-2008
  • Reageer

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Hallo,

Ik probeer tevergeefs de demo applicatie die het gebruik van libavcodec uit ffmpeg demonstreert te compileren. (Zie hier: http://www.inb.uni-luebeck.de/~boehme/using_libavcodec.html )

Ik heb de laatste code uit de subversion van ffmpeg gehaald, en deze compileert zonder problemen.
De bovenstaande code compileert mits enkele kleine updates ook zonder problemen.

Bij het linken gaat het echter fout:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
debian:~/decoder# g++ -v decoder.o libavcodec.a libavformat.a libavutil.a
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --with-tune=i686 --enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
 /usr/lib/gcc/i486-linux-gnu/4.1.2/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.1.2/crtbegin.o -L/usr/lib/gcc/i486-linux-gnu/4.1.2 -L/usr/lib/gcc/i486-linux-gnu/4.1.2 -L/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib -L/lib/../lib -L/usr/lib/../lib decoder.o libavcodec.a libavformat.a libavutil.a -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/i486-linux-gnu/4.1.2/crtend.o /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crtn.o
decoder.o: In function `main':
decoder.cpp:(.text+0xfa): undefined reference to `av_register_all()'
decoder.cpp:(.text+0x12c): undefined reference to `av_open_input_file(AVFormatContext**, char const*, AVInputFormat*, int, AVFormatParameters*)'
decoder.cpp:(.text+0x14c): undefined reference to `av_find_stream_info(AVFormatContext*)'
decoder.cpp:(.text+0x189): undefined reference to `dump_format(AVFormatContext*, int, char const*, int)'
decoder.cpp:(.text+0x1fb): undefined reference to `avcodec_find_decoder(CodecID)'
decoder.cpp:(.text+0x222): undefined reference to `avcodec_open(AVCodecContext*, AVCodec*)'
decoder.cpp:(.text+0x23a): undefined reference to `avcodec_alloc_frame()'
decoder.cpp:(.text+0x242): undefined reference to `avcodec_alloc_frame()'
decoder.cpp:(.text+0x277): undefined reference to `avpicture_get_size(int, int, int)'
decoder.cpp:(.text+0x2b6): undefined reference to `avpicture_fill(AVPicture*, unsigned char*, int, int, int)'
decoder.cpp:(.text+0x2f5): undefined reference to `avcodec_decode_video(AVCodecContext*, AVFrame*, int*, unsigned char*, int)'
decoder.cpp:(.text+0x334): undefined reference to `img_convert(AVPicture*, int, AVPicture const*, int, int, int)'
decoder.cpp:(.text+0x382): undefined reference to `av_read_frame(AVFormatContext*, AVPacket*)'
decoder.cpp:(.text+0x3ab): undefined reference to `av_free(void*)'
decoder.cpp:(.text+0x3b6): undefined reference to `av_free(void*)'
decoder.cpp:(.text+0x3c1): undefined reference to `avcodec_close(AVCodecContext*)'
decoder.cpp:(.text+0x3cc): undefined reference to `av_close_input_file(AVFormatContext*)'
collect2: ld returned 1 exit status


De .a files heb ik zelf gecompileerd zonder enig probleem.
Ik heb ook al geprobeerd om ffmpeg te apt-getten en dan de .so files van die package mee te linken, met hetzelfde resultaat.

Dus:
code:
1
2
3
g++ decoder.o -lavcodec -lavformat -lavutil -L/root/decoder
g++ decoder.o /usr/lib/libavcodec.so.0d /usr/lib/libavutil.so.0d /usr/lib/libavformat.so.0d
=> zelfde resultaat als hierboven


Nochtans zit bv. de methode av_register_all zeker in libavformat.a .
Als ik het goed heb bewijst het volgende dit:
code:
1
2
debian:~/decoder# nm libavformat.a | grep av_register_all
00000000 T av_register_all


Ik snap niet wat er fout gaat ...
De errors die ik krijgen geven de indruk dat de libraries helemaal niet meegelinkt worden, maar ik geef ze nochtans correct op aan het gcc commando toch?

Iemand enig idee?

[ Voor 15% gewijzigd door DieterVDW op 27-11-2007 14:30 ]


  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Ja ik heb ook gegoogled en die thread had ik al gezien.
Het grote verschil met mijn probleem is dat die kerel helemaal geen libraries opgeeft, en zijn probleem dus vrij eenvoudig en logisch is.

Ik geef echter wél heel expliciet de libraries op die moeten meegelinkt worden, en tóch krijg ik dit probleem. GCC lijkt de libraries dus gewoon stilletjes te negeren ... ? Waarom?

Ik ben geen expert, maar linker-problemen oplossen kan ik normaal toch echt wel.
Ben ik nu zo in de war dat ik mijn GCC syntax helemaal verkeerd heb of zo ...?

Verwijderd

g++ -o decoder decoder.o -lavcodec -lavformat -lavutil
Doet die het?

[ Voor 8% gewijzigd door Verwijderd op 27-11-2007 14:52 ]


  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Verwijderd schreef op dinsdag 27 november 2007 @ 14:45:
g++ decoder.o -lavcodec -lavformat -lavutil
Doet die het?
Als ik die commandolijn exact invoer dan krijg ik de melding dat -lavcodec niet gevonden wordt (wat logisch is).
Als ik dan deze commandolijn invoer:
g++ decoder.o -lavcodec -lavformat -lavutil -L/root/decoder

Dan krijg ik dezelfde error als in de startpost.
(In /root/decoder staan de libav*.a files.)

Edit: idem als ik bij beide -o decoder toevoeg hoor.

[ Voor 5% gewijzigd door DieterVDW op 27-11-2007 14:54 ]


Verwijderd

DieterVDW schreef op dinsdag 27 november 2007 @ 14:53:
[...]


Als ik die commandolijn exact invoer dan krijg ik de melding dat -lavcodec niet gevonden wordt (wat logisch is).
Als ik dan deze commandolijn invoer:
g++ decoder.o -lavcodec -lavformat -lavutil -L/root/decoder

Dan krijg ik dezelfde error als in de startpost.
(In /root/decoder staan de libav*.a files.)
Dan moet je de avcodec libs correct installeren of er correct naar verwijzen.
Waarom is het logisch dat lavcodec niet wordt gevonden? Daar staan toch de functies in die hij nodig heeft om te linken? Je zegt immers zelf dat je die hebt:
De .a files heb ik zelf gecompileerd zonder enig probleem.
"g++ decoder.o -lavcodec -lavformat -lavutil -L/root/decoder" geeft jouw error, omdat hij volgens mij "-L/root/decoder" dan gaat proberen te linken, maar die heeft dan weer de avcodec library nodig, die hij dus nog niet gelinked heeft.

[ Voor 13% gewijzigd door Verwijderd op 27-11-2007 15:01 ]


  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Verwijderd schreef op dinsdag 27 november 2007 @ 14:55:
[...]


Dan moet je de avcodec libs correct installeren of er correct naar verwijzen.

"g++ decoder.o -lavcodec -lavformat -lavutil -L/root/decoder" geeft jouw error, omdat hij volgens mij "-L/root/decoder" dan gaat proberen te linken, maar die heeft dan weer de avcodec library nodig, die hij dus nog niet gelinked heeft.
Met de -L optie geef je het zoekpad voor de libraries aan hé.
En /root/decoder is de directory waarin de libraries staan.
De compiler geeft trouwens normaal een fout als 'm een opgegeven library niet vindt, dus ik denk niet dat dat het probleem is.
Maar hoe zou ik het dan correct kunnen doen denk je?

Verwijderd

DieterVDW schreef op dinsdag 27 november 2007 @ 15:02:
[...]


Met de -L optie geef je het zoekpad voor de libraries aan hé.
En /root/decoder is de directory waarin de libraries staan.
Oh, mijn excuses, dat wist ik niet.
De compiler geeft trouwens normaal een fout als 'm een opgegeven library niet vindt, dus ik denk niet dat dat het probleem is.
Maar hoe zou ik het dan correct kunnen doen denk je?
Ik zit zelf meestal te knoeien met makefiles en scons dus ik ben even clueless vrees ik...

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Ik dacht even dat mijn machine behekst was of zoiets, maar op een andere machine hetzelfde gedrag ...

Verwijderd

Probeer ipv dit:
g++ decoder.o -lavcodec -lavformat -lavutil -L/root/decoder
Eens dit:
g++ decoder.o -L/root/decoder -lavcodec -lavformat -lavutil

Volgorde van libs toevoegen doet er toe, dus ik kan me voorstellen dat het pad eerst moet staan </gokje>
[edit] Ook: het staat in /root ... voer je g++ uit als super-user? Ik kan me voorstellen dat hij bvb de libs wel vindt, maar geen machtiging heeft ... alhoewel hij daarvoor natuurlijk zou moeten waarschuwen. Nog een gokje dus :P

[ Voor 30% gewijzigd door Verwijderd op 27-11-2007 15:17 ]


  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Nee nog steeds hetzelfde ...
Maar de volgorde is inderdaad wel een goeie tip, daar ga ik even wat mee experimenteren ...

Edit: No joy ...
Edit2: Ik ben root, dus permissies zouden geen probleem mogen zijn ...

Kan er iets fout zijn met de gegenereerde libraries?
Ik heb gewoon make gedaan in de ffmpeg root dir, lijkt me wel ok?
En zoals ik al zei: ik heb ook eens ffmpeg ge-apt-get't en de dynamische libs die in die package zitten meegelinkt, maar steeds hetzelfde resultaat ...

[ Voor 66% gewijzigd door DieterVDW op 27-11-2007 15:23 ]


Verwijderd

DieterVDW schreef op dinsdag 27 november 2007 @ 15:17:
Nee nog steeds hetzelfde ...
Maar de volgorde is inderdaad wel een goeie tip, daar ga ik even wat mee experimenteren ...

Edit: No joy ...
Edit2: Ik ben root, dus permissies zouden geen probleem mogen zijn ...

Kan er iets fout zijn met de gegenereerde libraries?
Ik heb gewoon make gedaan in de ffmpeg root dir, lijkt me wel ok?
En zoals ik al zei: ik heb ook eens ffmpeg ge-apt-get't en de dynamische libs die in die package zitten meegelinkt, maar steeds hetzelfde resultaat ...
Er kan iets fout zijn met die libraries, maar of dat zo is en wat het is, is moeilijk te zeggen op afstand.
Als je me de juiste wget commando's geeft wil ik wel even proberen voor je.

[ Voor 5% gewijzigd door Verwijderd op 27-11-2007 15:31 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:17
Er was toch een commando die je vertelde welke symbols worden geexporteerd uit een library? ldd of zo?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
farlane schreef op dinsdag 27 november 2007 @ 15:37:
Er was toch een commando die je vertelde welke symbols worden geexporteerd uit een library? ldd of zo?
Blijkbaar werkt dat commando alleen voor shared libraries.

Update:
Als ik het volgende commando doe:
g++ -I/usr/include/ffmpeg -Wall -o decoder decoder.cpp -lavformat -lavcodec -lavutil
Dan lukt het wel ...

Ik vermoed dat de versie van de SVN Trunk van de ffmpeg subversion gewoon f#@d up is ...
SVN snapshots work really well 99% of the time so people are not afraid to use them.
Riiight ...

[ Voor 39% gewijzigd door DieterVDW op 27-11-2007 15:59 ]

Pagina: 1