Ошибка включения ‹libavformat/avformat.h› в проект FFMPEG на Mac с использованием clang

У меня возникли проблемы с запуском кода примера remuxing.c. Я получаю следующую ошибку. Я подтвердил, что файлы можно найти в /usr/local/include. Я использую macOS Sierra 10.12.6.

$ cc -v playground/remuxing.c
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
 "/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.12.0 -Wdeprecat
ed-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all -disable-free -disable-llvm-v
erifier -discard-value-names -main-file-name remuxing.c -mrelocation-model pic -pic-level 2 -mthread-mo
del posix -mdisable-fp-elim -fno-strict-return -masm-verbose -munwind-tables -target-cpu penryn -target
-linker-version 305 -v -dwarf-column-info -debugger-tuning=lldb -resource-dir /Library/Developer/Comman
dLineTools/usr/lib/clang/9.0.0 -fdebug-compilation-dir /Users/myuser/github/personal/synthesthesi
a -ferror-limit 19 -fmessage-length 103 -stack-protector 1 -fblocks -fobjc-runtime=macosx-10.12.0 -fenc
ode-extended-block-signature -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o /var/
folders/8s/2xc3v8dd7zz2c2trymzybvd534bnhg/T/remuxing-819223.o -x c playground/remuxing.c
clang -cc1 version 9.0.0 (clang-900.0.39.2) default target x86_64-apple-darwin16.7.0
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /Library/Developer/CommandLineTools/usr/lib/clang/9.0.0/include
 /Library/Developer/CommandLineTools/usr/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
 "/Library/Developer/CommandLineTools/usr/bin/ld" -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -no_deduplicate -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o a.out /var/folders/8s/2xc3v8dd7zz2c2trymzybvd534bnhg/T/remuxing-819223.o -lSystem /Library/Developer/CommandLineTools/usr/lib/clang/9.0.0/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
  "_av_dump_format", referenced from:
      _main in remuxing-819223.o
  "_av_freep", referenced from:
      _main in remuxing-819223.o
  "_av_interleaved_write_frame", referenced from:
      _main in remuxing-819223.o
  "_av_mallocz_array", referenced from:
      _main in remuxing-819223.o
  "_av_packet_unref", referenced from:
      _main in remuxing-819223.o
  "_av_read_frame", referenced from:
      _main in remuxing-819223.o
  "_av_rescale_q", referenced from:
      _main in remuxing-819223.o
  "_av_rescale_q_rnd", referenced from:
      _main in remuxing-819223.o
  "_av_strerror", referenced from:
      _av_make_error_string in remuxing-819223.o
  "_av_write_trailer", referenced from:
      _main in remuxing-819223.o
  "_avcodec_parameters_copy", referenced from:
      _main in remuxing-819223.o
  "_avformat_alloc_output_context2", referenced from:
      _main in remuxing-819223.o
  "_avformat_close_input", referenced from:
      _main in remuxing-819223.o
  "_avformat_find_stream_info", referenced from:
      _main in remuxing-819223.o
  "_avformat_free_context", referenced from:
      _main in remuxing-819223.o
  "_avformat_new_stream", referenced from:
      _main in remuxing-819223.o
  "_avformat_open_input", referenced from:
      _main in remuxing-819223.o
  "_avformat_write_header", referenced from:
      _main in remuxing-819223.o
  "_avio_closep", referenced from:
      _main in remuxing-819223.o
  "_avio_open", referenced from:
      _main in remuxing-819223.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

person benwiz    schedule 02.07.2018    source источник


Ответы (2)


Библиотека состоит из двух частей: интерфейса (<libavformat/avformat.h>) и реализации. Вы должны включить оба.

Если у вас нет файла avformat.h, вы получите сообщение об отсутствующем файле или использовании неопределенных функций. Вы не получаете эти сообщения об ошибках, поэтому мы можем быть уверены, что вы avformat.h включены.

Если вы не свяжетесь с библиотекой, вы получите ошибки с неопределенными символами. Это ошибки, которые вы получаете, обычно вы должны связываться с -lavformat, но в зависимости от путей поиска библиотеки вам также может потребоваться передать параметр -L. Кроме того, вы можете указать полный путь к библиотеке, например /usr/local/lib/libavformat.a или /usr/local/lib/libavformat.dylib (или что-то еще), но обычно это не рекомендуется, поскольку это может сделать ваши сценарии сборки более уязвимыми.

Я ожидал увидеть что-то вроде этого:

cc -Wall -Wextra playground/remuxing.c -lavformat

Если /usr/local/lib нет в пути поиска вашей библиотеки, вы должны добавить его с помощью -L:

cc -Wall -Wextra playground/remuxing.c \
    -L/usr/local/lib -lavformat

Если libavformat является статической библиотекой с зависимостями, вам также необходимо включить эти зависимости. Если это динамическая библиотека, в этом нет необходимости. Вы можете вообще избежать этого вопроса, используя pkg-config, если он установлен в вашей системе:

cc -Wall -Wextra playground/remuxing.c \
    $(pkg-config --cflags --libs avformat)

(Не уверен, что avformat здесь правильное имя, но обычно вы хотите использовать pkg-config для поиска библиотек, если у вас нет веских причин не использовать его.)

person Dietrich Epp    schedule 02.07.2018
comment
Большое спасибо — cc -lavformat playground/remuxing.c скомпилировано без ошибок. Надеюсь дальше все будет работать. - person benwiz; 02.07.2018
comment
@benwiz: я также рекомендую использовать -Wall -Wextra. Без предупреждений компилятор не поймает столько ошибок в коде. - person Dietrich Epp; 02.07.2018

Также это тоже должно работать:
После configure создания FFmpeg в том же каталоге используйте: make examples обычно это компилирует все примеры.

Кажется, это также упоминается здесь: FFmpeg: создание примеров кодов C

person the kamilz    schedule 03.07.2018