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 libavcodec
te 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 -L
Specificeert een extra zoekpad naar opzoekbibliotheken die zijn opgegeven met behulp van de optie -L
, dat is libavcodec.x.y.z
in 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 .c
bestand 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 .h
bestand (en) in kwestie, kunt u hun opname omringen met extern "C"
:
extern "C" {
#include <abc.h>
} //extern