使用 clang 在 Mac 上的 FFMPEG 项目中包含 <libavformat/avformat.h> 时出错

Error inclunding <libavformat/avformat.h> in FFMPEG project on a Mac using clang

我 运行 remuxing.c example code 遇到了问题。我收到以下错误。我已经确认可以在 /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)

一个库由两部分组成:接口(<libavformat/avformat.h>)和实现。您必须同时包括两者。

如果您没有 avformat.h 文件,您将收到有关丢失文件或使用未定义函数的错误。您没有收到这些错误消息,因此我们可以确信您 avformat.h 已包含在内。

如果您不 link 使用该库,您将得到未定义的符号错误。这些是您收到的错误,通常您必须 link 和 -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 来查找库,除非您有充分的理由不使用它。)

这也应该有效:
configure'ing FFmpeg 后,在同一目录中,使用:make examples 这通常会编译所有 示例 .

这里好像也提到了这个: