无法 link 针对 FFmpeg 库

Unable to link against FFmpeg libaries

我尝试构建它,但总是出现 link 时间错误。

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

link-错误如下

$ 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++ 命令有一个 linker 选项 -Wl,-rpath=/usr/local/lib,但它仍然不起作用。此外,如果调用了发行版提供的其他版本,我会尝试使用 inotifywait 进行监视。它们不是,在执行 g++ 期间打开的那个是 /usr/local/lib/libavutil.so.

总结:

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

  2. -rpath 用于对共享库强制 link。

  3. 为什么link时间错误? T_T

如有任何建议或信息,我们将不胜感激!谢谢!

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

这也让我困惑了一阵子。我设法 google 这个:http://soledadpenades.com/2009/11/24/linking-with-ffmpegs-libav/

原来 FFMPEG 没有让他们的 header 文件 C++ 知道。

修复如下:

extern "C"
{
#include <libavutil/log.h>
}

int main(int argc, char *argv[])
{
    ::av_log_set_flags(AV_LOG_SKIP_REPEATED);
    return 0;
}

您需要用 extern "C" 链接包装所有 ffmpeg header 包含。