Ошибка при включении <libavformat / avformat.h> в проект FFMPEG на Mac с использованием clang - PullRequest
0 голосов
/ 02 июля 2018

У меня проблемы с запуском 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)

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

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

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

0 голосов
/ 02 июля 2018

Библиотека состоит из двух частей: интерфейса (<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 для поиска библиотек, если у вас нет веских причин не использовать его.)

...