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

跟風遠走 提交于 2019-12-24 21:42:35

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!