【问题标题】:Error inclunding <libavformat/avformat.h> in FFMPEG project on a Mac using clang使用 clang 在 Mac 上的 FFMPEG 项目中包含 <libavformat/avformat.h> 时出错
【发布时间】:2018-12-10 21:24:21
【问题描述】:

我在运行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)

【问题讨论】:

    标签: c ffmpeg clang libav libavformat


    【解决方案1】:

    库由两部分组成:接口 (&lt;libavformat/avformat.h&gt;) 和实现。您必须同时包含两者。

    如果您没有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 来查找库,除非您有充分的理由不使用它。)

    【讨论】:

    • 非常感谢 - cc -lavformat playground/remuxing.c 编译没有错误。希望一切都会继续工作。
    • @benwiz:我也推荐使用-Wall -Wextra。如果没有警告,编译器将不会在代码中捕获尽可能多的错误。
    【解决方案2】:

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

    这里似乎也提到了这一点: FFmpeg: building example C codes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2016-08-25
      相关资源
      最近更新 更多