我尝试构建它,但总是遇到链接时错误。
#include <libavutil/log.h>
int main(int argc, char *argv[])
{
::av_log_set_flags(AV_LOG_SKIP_REPEATED);
return 0;
}
我的发行版是Debian GNU / Linux 8(jessie)。 FFmpeg是我自己构建的,configure命令是......
$ ./configure --prefix=/usr/local --disable-static --enable-shared \
> --extra-ldflags='-Wl,-rpath=/usr/local/lib'
链接错误如下。
$ g++ foo.cpp -D__STDC_CONSTANT_MACROS -Wall \
> -Wl,-rpath=/usr/local/lib \
> $(pkg-config --cflags --libs libavutil)
/tmp/ccKzgEFb.o: In function `main':
foo.cpp:(.text+0x17): undefined reference to `av_log_set_flags(int)'
collect2: error: ld returned 1 exit status
pkg-config
的输出是......
$ pkg-config --cflags --libs libavutil
-I/usr/local/include -L/usr/local/lib -lavutil
objdump
显示共享对象libavutil.so内部有av_log_set_flogs
。
$ objdump --dynamic-syms /usr/local/lib/libavutil.so | grep 'av_log_set_flags'
000260f0 g DF .text 0000000a LIBAVUTIL_54 av_log_set_flags
请注意,用于构建上述应用程序的g++
命令具有链接器选项-Wl,-rpath=/usr/local/lib
,但它仍然不起作用。此外,如果调用发行版提供的其他版本,我已尝试使用inotifywait
进行监控。它们不是,在执行g++
期间打开的那个是/usr/local/lib/libavutil.so。
要点:
/usr/local/lib/libavutil.so确实有符号。
-rpath
用于强制链接共享库。
为什么会出现链接时错误? T_T
任何建议或信息都将受到高度赞赏!谢谢!
REEDIT:ffplay
正常工作,ldd
显示它使用/usr/local/lib/libavutil.so。因此,库似乎没有被破坏,问题就变成了如何构建自己的代码来使用库。
答案 0 :(得分:3)
这让我感到困惑了一段时间。我设法谷歌这个:http://soledadpenades.com/2009/11/24/linking-with-ffmpegs-libav/
事实证明FFMPEG
没有让头文件C++
知道。
以下是修复:
extern "C"
{
#include <libavutil/log.h>
}
int main(int argc, char *argv[])
{
::av_log_set_flags(AV_LOG_SKIP_REPEATED);
return 0;
}
您需要使用ffmpeg
链接包装所有extern "C"
标头。