我正在一个C++项目中使用来自ffmpeg的libavcodec和libavformat库。使用g++编译器链接-lavcodec -lavformat可以正常工作,但是当我尝试在一个automake项目中编译相同的代码时,不知道出了什么问题。
正常运行:
g++ -o test -D__STDC_CONSTANT_MACROS -lavcodec -lavformat test.cpp
无法工作的 Makefile.am:
binaryname_LDFLAGS= -lavcodec -lavformat
错误:
....
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function
ff_nut_add_sp: error: undefined reference to 'av_tree_node_size'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function
ff_nut_add_sp: error: undefined reference to 'av_tree_insert'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function
ff_nut_free_sp: error: undefined reference to 'av_tree_enumerate'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function
ff_nut_free_sp: error: undefined reference to 'av_tree_destroy'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(rtp.o):function
ff_rtp_get_payload_type: error: undefined reference to 'av_opt_get_int'
...
同样无法工作:
LDFLAGS=...-lavcodec -lavformat
错误:
src/dsp/audioDecoder.cpp:99: error: undefined reference to 'av_register_all'
src/dsp/audioDecoder.cpp:101: error: undefined reference to 'avcodec_find_decoder'
src/dsp/audioDecoder.cpp:109: error: undefined reference to 'avcodec_alloc_context'
src/dsp/audioDecoder.cpp:120: error: undefined reference to 'avcodec_open2'
src/dsp/audioDecoder.cpp:125: error: undefined reference to 'av_init_packet'
src/dsp/audioDecoder.cpp:188: error: undefined reference to 'avcodec_decode_audio3'
在第二种情况下,如果我不设置任何连接器,则无法找到包含头文件,因此链接器似乎被某种方式识别。
make V=1 返回:
make all-am
make[1]: Go to '/path/to/trunk'
/bin/bash ./libtool --tag=CXX --mode=link g++ -O2 -lrt -D__STDC_CONSTANT_MACROS -o binaryname progsrc/binaryname/binaryname-binaryname.o -lm -lpthread -ldl -lmygeneratedlibrary
libtool: link: g++ -O2 -D__STDC_CONSTANT_MACROS -o binaryname progsrc/binaryname/binaryname-binaryname.o -lm /path/to//trunk/.libs/lmygeneratedlibrary.a -lrt -lavutil -lavcodec -lavformat -lpthread -ldl
make[1]: Leave '/path/to/trunk'
我在这里做错了什么?
-lavutil
完整的make V=1
输出如下: - Cornstalks-lavutil
是必需的。libavformat
依赖于它。如果您没有先遇到其他错误,那么您会收到有关其丢失的错误信息。 - Cornstalksextern "C"{...}
将它们包围起来了? - Cornstalks