Подтвердить что ты не робот

Gcc: undefined ссылка на

Я хотел бы скомпилировать это.

program.c

#include <libavcodec/avcodec.h>

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

Запуск этого

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

дает ошибку

/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. Почему это происходит?

4b9b3361

Ответ 1

Однако определяется avpicture_get_size.

Нет, поскольку заголовок (<libavcodec/avcodec.h>) просто объявляет.

определение находится в самой библиотеке.

Итак, вы можете добавить параметр компоновщика для ссылки libavcodec при вызове gcc:

-lavcodec

Также обратите внимание, что библиотеки должны быть указаны в командной строке после для файлов, требующих их:

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

Не:

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

Update:

Ссылаясь на комментарий Wyzard, полная команда может выглядеть так:

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

Для библиотек, не сохраненных в стандартном местоположении компоновщиков, опция -L указывает дополнительный путь поиска к библиотекам поиска, указанным с помощью опции -L, то есть libavcodec.x.y.z в этом случае.


Подробную ссылку на опцию gcc-компоновщика читайте здесь.

Ответ 2

Вы смешиваете C и С++? Одна из проблем, которые могут возникнуть, состоит в том, что объявления в файле .h для файла .c должны быть окружены:

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

и

#if defined(__cplusplus)
  }
#endif