web-dev-qa-db-fra.com

gcc: référence non définie à

Je voudrais compiler ceci.

programme.c

#include <libavcodec/avcodec.h>

int main(){
    int i = avpicture_get_size(AV_PIX_FMT_RGB24,300,300);
}

Courir cette

gcc -I$HOME/ffmpeg/include program.c

donne une erreur

/tmp/ccxMLBme.o: In function `main':
program.c:(.text+0x18): undefined reference to `avpicture_get_size'
collect2: ld returned 1 exit status

Cependant, avpicture_get_size est défini. Pourquoi cela arrive-t-il?

39
jamie_y

Cependant, avpicture_get_size est défini.

Non, comme en-tête (<libavcodec/avcodec.h>) just le déclare .

La définition se trouve dans la bibliothèque elle-même.

Donc, vous voudrez peut-être ajouter l'option de l'éditeur de liens pour lier libavcodec lors de l'appel de gcc:

-lavcodec

Veuillez également noter que les bibliothèques doivent être spécifiées sur la ligne de commande après les fichiers qui en ont besoin:

gcc -I$HOME/ffmpeg/include program.c -lavcodec

Pas comme ceci:

gcc -lavcodec -I$HOME/ffmpeg/include program.c

Mise à jour:

En faisant référence au commentaire de Wyzard, la commande complète pourrait ressembler à ceci:

gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib -lavcodec

Pour les bibliothèques non stockées dans l'emplacement standard des lieurs, l'option -L spécifie un chemin de recherche supplémentaire pour les bibliothèques de recherche spécifiées à l'aide de la commande -l option, c’est libavcodec.x.y.z dans ce cas.


Pour une référence détaillée sur l'option de l'éditeur de liens de gcc, veuillez lire ici .

58
alk

Est-ce que vous mélangez C et C++? Un problème qui peut survenir est que les déclarations dans le fichier .h pour un fichier .c doivent être entourées par:

#if defined(__cplusplus)
  extern "C" {                 // Make sure we have C-declarations in C++ programs
#endif

et:

#if defined(__cplusplus)
  }
#endif
5
Technophile