使用 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
这通常会编译所有 示例 .
这里好像也提到了这个:
我 运行 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
这通常会编译所有 示例 .
这里好像也提到了这个: