gcc: ongedefinieerde verwijzing naar

Ik wil dit graag compileren.

programma.c

#include <libavcodec/avcodec.h>
int main(){
    int i = avpicture_get_size(AV_PIX_FMT_RGB24,300,300);
}

Dit uitvoeren

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

geeft fout

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

Avpicture_get_size is echter gedefinieerd. Waarom gebeurt dit?


Antwoord 1, autoriteit 100%

Avpicture_get_size is echter gedefinieerd.

Nee, zoals de header (<libavcodec/avcodec.h>) het gewoon declareert.

De definitiestaat in de bibliotheek zelf.

Dus misschien wil je de linkeroptie toevoegen om libavcodecte linken bij het aanroepen van gcc:

-lavcodec

Houd er ook rekening mee dat bibliotheken moeten worden opgegeven op de opdrachtregel nade bestanden die ze nodig hebben:

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

Nietzoals dit:

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

Verwijzend naar de opmerking van Wyzardkan de volledige opdracht er als volgt uitzien:

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

Voor bibliotheken die niet zijn opgeslagen in de Linkers Standaardlocatie De optie -LSpecificeert een extra zoekpad naar opzoekbibliotheken die zijn opgegeven met behulp van de optie -L, dat is libavcodec.x.y.zin dit geval.


Voor een gedetailleerde referentie over de linkeroptie van GCC, lees hier .


Antwoord 2, Autoriteit 14%

Meng je C en C++? Een probleem dat kan optreden, is dat de aangiften in de .h-bestand voor een .cbestand moeten worden omgeven door:

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

en:

#if defined(__cplusplus)
  }
#endif

OPMERKING: indien mogelijk / niet-gericht om de .hbestand (en) in kwestie, kunt u hun opname omringen met extern "C":

extern "C" {
#include <abc.h>
} //extern

Other episodes