[ffmpeg / C++] Problème de linkage

jeje6_3 Messages postés 12 Date d'inscription lundi 18 janvier 2010 Statut Membre Dernière intervention 3 mars 2010 - 3 déc. 2009 à 23:57
jeje6_3 Messages postés 12 Date d'inscription lundi 18 janvier 2010 Statut Membre Dernière intervention 3 mars 2010 - 5 févr. 2010 à 19:15
Bonsoir,
Je souhaite utiliser la lib ffmpeg dans une application C++ avec MSYS/MinGW, dont voici le code :
#include 

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>

int main(void)
{
    av_register_all();
    printf("Hello world\n");
    return 0;
}



j'ai compilé ffmpeg puis l'ai installé, mais lorsque je tente de compiler ce code avec la commande :
g++ test.cpp -I/local/include/ -L/local/lib -lavformat -lavcodec -lz -lavutil -lm


j'obtiens l'erreur suivante :
C:/DOCUME~1/jeje/LOCALS~1/Temp/ccm1EQsi.o:test.cpp:(.text+0x2b): r├®f├®rence ind├®finie vers ┬½ av_register_all() ┬╗
collect2: ld returned 1 exit status



J'ai essayé de faire ce qu'il y a sur cette page : http://www.dranger.com/ffmpeg/ mais cela plante au moment du linkage

Pour la compilation et l'installation de ffmpeg, je me suis inspiré de cette page : http://ffmpeg.arrozcru.org/wiki/index.php?title=Main_Page


Voila, j'espère que quelqu'un pourra m'aider

Merci d'avance

7 réponses

fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
4 déc. 2009 à 08:34
Salut,


je n'ai pas l'habitude de ce genre d'environnement. Mais es-tu sûre que tes libav* sont dans /lib ou /local/lib ? Et pas plutot dans un répertoire style /local/lib/libav*
jeje6_3 Messages postés 12 Date d'inscription lundi 18 janvier 2010 Statut Membre Dernière intervention 3 mars 2010
4 déc. 2009 à 14:46
salut fregolo,
Non, elles se trouvent bien dans ce dossier, et puis si elles n'avaient pas été trouvées, j'aurais eu un autre message d'erreur du genre :
/usr/bin/ld: cannot find -l<libmanquante>
collect2: ld returned 1 exit status


Le pire c'est que je vien d'essayer la même chose sous Linux ( Kubuntu 9.10 ), j'obtiens les mêmes erreurs et aucune doc ne parle de ça

D'autre idées ? Merci d'avance
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
4 déc. 2009 à 15:47
Bon bah restons sur ubuntu pour les tests !!

Essaie de dumper les lib pour voir ce qu'elles ont dans le ventre et voir où serait av_register_all :

nm nomdelalib

Euh je crois que c'est nm pour avoir ça.
jeje6_3 Messages postés 12 Date d'inscription lundi 18 janvier 2010 Statut Membre Dernière intervention 3 mars 2010
4 déc. 2009 à 16:11
Arf, je crois que j'ai un problème :
nm /usr/lib/libavcodec.so.52
nm: /usr/lib/libavcodec.so.52: no symbols
jeje@desktop:~$ nm /usr/lib/libavformat.so.52
nm: /usr/lib/libavformat.so.52: no symbols


C'est normal, ça ? (il s'agit de libs que j'ai créé à l'aide du svn, je vais tenter de les récupérer depuis les dépots Ubuntu)

Le problème étant que si je réussi à le faire marcher sous Linux, il faudra que je le fasse fonctionner sous Windows, donc si quelqu'un trouve une doc que je n'aurais pas vu, il faudrai me la montrer.

Des idées ?

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jeje6_3 Messages postés 12 Date d'inscription lundi 18 janvier 2010 Statut Membre Dernière intervention 3 mars 2010
4 déc. 2009 à 16:45
Désolé pour le double post mais je ne sais pas comment éditer mon précédent:
Je suis de retour sous Windows et voici le resultat de :
$ nm /local/lib/libavformat.a | grep av_register_all
00000000 T _av_register_all


Donc cela devrai marcher, non ?

Merci d'avance
jeje6_3 Messages postés 12 Date d'inscription lundi 18 janvier 2010 Statut Membre Dernière intervention 3 mars 2010
8 déc. 2009 à 15:18
Personne n'aurai une idée ?
jeje6_3 Messages postés 12 Date d'inscription lundi 18 janvier 2010 Statut Membre Dernière intervention 3 mars 2010
5 févr. 2010 à 19:15
Bonjour a tous !

Ça y est ! j'ai (enfin) trouvé d'où venait le problème.

Pour info :
référence indéfinie vers '' av_register_all() ''
vient du fait que ffmpeg est une bibliothèque écrite pour le C mais n'est pas compatible avec le C++, sauf si on l'écrit comme ça :
#include 
using namespace std;

extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
}

int main(...


Voila déjà le problème résolu... ou pas. En effet une fois que l'on à réglé ce problème il en vient plein d'autres. J'écris plein parceque tous les fichiers .a de ffmpeg "râlent" à propos de fichiers .c qui ne font pas leur boulo.

La aussi le problème est simple mais aussi idiot : ffmpeg était compilé en static ! Une fois recompilé en dynamique, tout va bien !

NB : pour le compiler en dynamique, suivez ce tuto : Ici

Voila, j'espère que ces infos serviront à quelqu'un

Jeje
Rejoignez-nous