gcc: referência indefinida a

Gostaria de compilar isto.

Programa.c

#include <libavcodec/avcodec.h>

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

a executar isto

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

dá um erro

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

No entanto, avpicture_get_size está definido. Porque é que isto está a acontecer?

Author: alk, 2014-03-15

2 answers

No entanto, avpicture_get_size está definido.

Não, como o cabeçalho (<libavcodec/avcodec.h>) apenas declara Isso.

A definição está na própria biblioteca.

Por isso, poderá querer adicionar a opção linker ao link libavcodec ao invocar o gcc:

-lavcodec

Por favor, note também que as bibliotecas precisam de ser especificadas na linha de comandos após os ficheiros que necessitam deles:

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

Não Tipo isto:

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

Actualizar:

Referindo-se a Wyzard's comentário o comando completo pode ser parecido com este:

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

Para As bibliotecas não armazenadas na localização-padrão dos linkers, a opção -L indica um caminho de pesquisa adicional para as bibliotecas de pesquisa indicadas com a opção -l, isto é libavcodec.x.y.z neste caso.


Para uma referência detalhada sobre a opção do linker do gcc, por favor leia aqui.

 50
Author: alk, 2017-05-23 12:02:39
Estás a misturar C E C++? Uma questão que pode ocorrer é que as declarações no .h file for A.o ficheiro c precisa de ser cercado por:
#if defined(__cplusplus)
  extern "C" {                 // Make sure we have C-declarations in C++ programs
#endif

E:

#if defined(__cplusplus)
  }
#endif
 4
Author: Technophile, 2017-03-03 01:32:49