2015-03-12 1 views
0

J'ai compilé libav en suivant les instructions dans leurs instructions README et INSTALL.référence indéfinie à "av_new_packet" (en utilisant Qt)

Maintenant j'essaye de suivre ce example de Qt créateur.

J'ai compris comment inclure les bibliothèques dont j'ai besoin dans le dossier du projet:

LIBS += \ 
/usr/local/lib/libavformat.a \ 
/usr/local/lib/libavutil.a 

et que je dois envelopper les directives Include dans un extern:

extern "C" { 
#include <libavformat/avformat.h> 
#include <libavutil/dict.h> 
} 

Le Le problème est que quand j'essaie de compiler mon projet Qt, je reçois juste des tas (environ 700) de messages sur une "référence indéfinie à 'av_new_packet'" à partir des fonctions de la bibliothèque.

Que dois-je faire d'autre pour que cela fonctionne?

Mise à jour:

J'ai remarqué - comme mes yeux devenaient floues d'être si tard - que les erreurs étaient dans les fichiers d'en-tête situés dans le dossier de téléchargement? C'est le dossier dans lequel j'ai exécuté les commandes configure et make qui ont ensuite généré les bibliothèques libav * .a dans/usr/local/lib avec lesquelles je suis en train de créer un lien. Est-ce correct? Comment puis-je corriger si ce n'est pas?

+0

Essayez 'readelf -s /usr/local/lib/libavformat.so | grep av_new_packet', et vérifiez si le symbole est ** défini **, et je ne recommande pas de lier aux bibliothèques statiques dans ce cas, vous pouvez également violer les termes de la licence. Et je crois qu'il vous manque 'libavcodec.a | so' aussi ... –

+0

il semble qu'il soit défini dans libavcodec.a (et n'est pas défini dans libavformat.a) - j'ai inclus cela dans la définition LIBS de Qt, mais je Je reçois toujours l'erreur. Aussi - vous devrez me pardonner car je suis un peu nouveau sur C++ - quel est le problème avec les bibliothèques statiques "dans ce cas"? – HorusKol

+2

Il n'y a rien de mal avec les bibliothèques statiques, ce n'est pas une question C++, mais une question légale. En un mot, lors de l'utilisation du code LGPL, votre utilisateur doit pouvoir relier votre code source fermé aux bibliothèques LGPL qu'il fournit. Ainsi, lorsque vous utilisez la liaison statique, vous devez fournir un '.lib' avec les objets pour tout le code source fermé, qui peut ensuite être lié statiquement aux bibliothèques LGPL. –

Répondre

0

Seulement une partie d'une réponse, mais j'ai fini par supprimer les librairies intégrées et télécharger les paquets libav * -dev pour Ubuntu 14.04.

Je pourrais alors établir un lien avec les fichiers objets partagés installés à

/usr/lib/x86_64-linux-gnu/libavformat.so 

et

/usr/lib/x86_64-linux-gnu/libavutil.so 

Ce supprimé les problèmes - peut-être parce que la version d'Ubuntu est arrimé à une version plus ancienne que ce que je bâtiment à partir de.