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

Signaler
Messages postés
12
Date d'inscription
lundi 18 janvier 2010
Statut
Membre
Dernière intervention
3 mars 2010
-
Messages postés
12
Date d'inscription
lundi 18 janvier 2010
Statut
Membre
Dernière intervention
3 mars 2010
-
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

Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
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*
Messages postés
12
Date d'inscription
lundi 18 janvier 2010
Statut
Membre
Dernière intervention
3 mars 2010

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
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
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.
Messages postés
12
Date d'inscription
lundi 18 janvier 2010
Statut
Membre
Dernière intervention
3 mars 2010

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 ?
Messages postés
12
Date d'inscription
lundi 18 janvier 2010
Statut
Membre
Dernière intervention
3 mars 2010

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
Messages postés
12
Date d'inscription
lundi 18 janvier 2010
Statut
Membre
Dernière intervention
3 mars 2010

Personne n'aurai une idée ?
Messages postés
12
Date d'inscription
lundi 18 janvier 2010
Statut
Membre
Dernière intervention
3 mars 2010

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