问题
I'm having trouble running the remuxing.c example code. I get the following error. I have confirmed that the files can be found in /usr/local/include
. I am running 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)
回答1:
A library consists of two parts: the interface (<libavformat/avformat.h>
) and the implementation. You must include both.
If you do not have the avformat.h
file, you would get an error about a missing file or use of an undefined functions. You are not getting these error messages, so we can be confident that you avformat.h
is being included.
If you don't link with the library, you will get undefined symbol errors. These are the errors you are getting, typically you must link with -lavformat
but depending on the library search paths you might need to pass a -L
option as well. Alternatively, you can specify the full path to the library, which will be something like /usr/local/lib/libavformat.a
or /usr/local/lib/libavformat.dylib
(or something else), but this is not typically recommended because it can make your build scripts more fragile.
I would expect to see something like this:
cc -Wall -Wextra playground/remuxing.c -lavformat
If /usr/local/lib
is not in your library search path you would add it with -L
:
cc -Wall -Wextra playground/remuxing.c \
-L/usr/local/lib -lavformat
If libavformat is a static library with dependencies you will also need to include those dependencies. If it is a dynamic library, this is unnecessary. You can avoid the question altogether by using pkg-config
if it is installed on your system:
cc -Wall -Wextra playground/remuxing.c \
$(pkg-config --cflags --libs avformat)
(Not sure if avformat
is the right name here, but in general you want to use pkg-config
to find libraries unless you have a good reason not to use it.)
回答2:
Also this should work too:
After configure
'ing FFmpeg, in same directory, use: make examples
this normally will compile all examples.
It seems this also mentioned here: FFmpeg: building example C codes
来源:https://stackoverflow.com/questions/51139736/error-inclunding-libavformat-avformat-h-in-ffmpeg-project-on-a-mac-using-clang