2015-09-13 2 views
1

Я попытался построить это, но всегда получал ошибку времени соединения.Не удалось подключиться к FFmpeg libaries

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

Любое предложение или информация были бы высоко оценены! Благодаря!

REEDIT: ffplay работает нормально и ldd показывает, что он использует /usr/local/lib/libavutil.so. Таким образом, библиотеки, похоже, не сломаны, и проблема заключается в том, как создавать свои собственные коды для использования библиотек.

ответ

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" связи.

+1

stackoverflow говорит: «Не используйте комментарий, чтобы сказать спасибо», но я действительно очень благодарю вас. T_T. Вы спасли мне жизнь, сэр. Я был так в отчаянии в этом, что даже голоса просили меня просто самоубийство. Большое вам спасибо, Галик. – Cody

Смежные вопросы