无法链接到FFmpeg库

时间:2015-09-13 04:00:36

标签: c++ linux ffmpeg debian

我尝试构建它,但总是遇到链接时错误。

#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。

要点:

  1. /usr/local/lib/libavutil.so确实有符号。

  2. -rpath用于强制链接共享库。

  3. 为什么会出现链接时错误? T_T

  4. 任何建议或信息都将受到高度赞赏!谢谢!

    REEDIT:ffplay正常工作,ldd显示它使用/usr/local/lib/libavutil.so。因此,库似乎没有被破坏,问题就变成了如何构建自己的代码来使用库。

1 个答案:

答案 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"标头。