使用clang在Mac上的FFMPEG项目中包含时出错

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

库由两部分组成:接口( )和实现。 你必须包括两者。

如果您没有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则可以完全避免使用pkg-config

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

(不确定avformat在这里是否是正确的名称,但通常您希望使用pkg-config查找库,除非您有充分的理由不使用它。)

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

这似乎也在这里提到: FFmpeg:构建示例C代码