无法 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.
总结:
/usr/local/lib/libavutil。所以确实有符号。
-rpath
用于对共享库强制 link。
为什么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 包含。
我尝试构建它,但总是出现 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.
总结:
/usr/local/lib/libavutil。所以确实有符号。
-rpath
用于对共享库强制 link。为什么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 包含。