ошибки при компиляции кода c библиотекой ffmpeg

Я установил библиотеку ffmpeg в моей новой ОС Ubuntu 16.04. Когда я попытался скомпилировать свой код c, я получил следующие странные ошибки:

/home/widerstand/ffmpeg_build/lib/libavutil.a(hwcontext_vaapi.o): In function `vaapi_device_free':
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:861: undefined reference to `XCloseDisplay'
/home/widerstand/ffmpeg_build/lib/libavutil.a(hwcontext_vaapi.o): In function `vaapi_device_create':
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:891: undefined reference to `XOpenDisplay'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:896: undefined reference to `vaGetDisplay'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:903: undefined reference to `XDisplayName'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:893: undefined reference to `XDisplayName'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:917: undefined reference to `vaGetDisplayDRM'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:891: undefined reference to `XOpenDisplay'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:893: undefined reference to `XDisplayName'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:898: undefined reference to `XDisplayName'
/home/widerstand/ffmpeg_build/lib/libavutil.a(hwcontext_vdpau.o): In function `vdpau_device_create':
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vdpau.c:431: undefined reference to `XOpenDisplay'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vdpau.c:437: undefined reference to `XDisplayString'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vdpau.c:439: undefined reference to `XDefaultScreen'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vdpau.c:439: undefined reference to `vdp_device_create_x11'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vdpau.c:433: undefined reference to `XDisplayName'
/home/widerstand/ffmpeg_build/lib/libavutil.a(hwcontext_vdpau.o): In function `vdpau_device_free':
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vdpau.c:410: undefined reference to `XCloseDisplay'
collect2: error: ld returned 1 exit status
Makefile:30: recipe for target 'video_analysis' failed
make: *** [video_analysis] Error 1

Я переустанавливал библиотеку ffmpeg несколько раз, используя следующие конфигурации:

PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags="-I$HOME/ffmpeg_build/include" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
  --bindir="$HOME/bin" \
  --enable-gpl \
  --enable-libass \
  --enable-libfdk-aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libtheora \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libx264 \
  --enable-nonfree
PATH="$HOME/bin:$PATH" make

Процесс установки был успешным каждый раз. Но когда я пытался скомпилировать свой собственный c-код, я всегда сталкивался с такими же ошибками, как упомянуто выше. Я понятия не имею об этом ... Вот makefile, который я использовал:

РЕДАКТИРОВАТЬ:

FFMPEG_LIBS=    libavdevice                        \
                libavformat                        \
                libavfilter                        \
                libavcodec                         \
                libswresample                      \
                libswscale                         \
                libavutil                          \

TARGET = video_analysis
LIBS = -lX11 -lm -lvdpau -lva
CC = gcc
CFLAGS += -O2 -g -O0
CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS)
LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -c 
FFMPEG_LIBS=    libavdevice                        \
                libavformat                        \
                libavfilter                        \
                libavcodec                         \
                libswresample                      \
                libswscale                         \
                libavutil                          \

TARGET = video_analysis
LIBS = -lX11 -lm -lvdpau -lva
CC = gcc
CFLAGS += -O2 -g -O0
CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS)
LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -c $< -o [email protected]

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) $(LDLIBS) $(LIBS) -o [email protected]

clean:
    -rm -f *.o
    -rm -f $(TARGET)
lt; -o [email protected] .PRECIOUS: $(TARGET) $(OBJECTS) $(TARGET): $(OBJECTS) $(CC) $(OBJECTS) $(LDLIBS) $(LIBS) -o [email protected] clean: -rm -f *.o -rm -f $(TARGET)

РЕДАКТИРОВАТЬ:

После замены $ (LIBS) и $ (LDLIBS) на $ (LDLIBS) $ (LIBS) в строке 30 это выглядит намного лучше, но компилятор по-прежнему сообщает о следующих ошибках:

/root/ffmpeg_build/lib/libavutil.a(hwcontext_vaapi.o): In function `vaapi_device_create':
/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:896: undefined reference to `vaGetDisplay'
/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:917: undefined reference to `vaGetDisplayDRM'

Я понятия не имею, какая библиотека все еще отсутствует? Похоже, что libva все еще отсутствует? ... Я получил ответ сам ... Посмотрите здесь:ошибки «vaGetDisplay» и «vaGetDisplayDRM»

 Kindermann11 авг. 2016 г., 10:54
@BrunoLevy и я также уже установили libva до ...
 Kindermann11 авг. 2016 г., 10:49
Я добавил -lva, но компилятор все еще жаловался, как будто я не добавил ...
 Kindermann10 авг. 2016 г., 11:24
@BrunoLevy Я загрузил make-файл выше ...
 Some programmer dude09 авг. 2016 г., 14:10
Кажется, вы забыли связать ваше приложение с некоторыми необходимыми библиотеками. Поиск этих функций, чтобы увидеть, какие библиотеки необходимы.
 Kindermann11 авг. 2016 г., 10:46
Я поменял их местами, и это сделало мир лучше! жалобы на ошибку сокращены до: /root/ffmpeg_build/lib/libavutil.a(hwcontext_vaapi.o): в функцииvaapi_device_create': /ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:896: undefined reference to vaGetDisplay '/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:917: неопределенная ссылка на `vaGetDisplayDRM'
 Kindermann09 авг. 2016 г., 14:48
@BrunoLevy Я установил libX11 и поместил -lX11 в мой Makefile. Но ошибки не исчезли. Возможно ли, что библиотека ffmpeg не смогла найти libX11? Нужно ли настраивать путь при установке libX11, чтобы он распознавался библиотекой ffmpeg?
 Josh de Kock27 авг. 2016 г., 03:37
@ Kindermann Вы нашли мой ответ полезным? Вы думали опринимая это?
 Kindermann27 авг. 2016 г., 14:53
@ Джош де Кок Спасибо за ваш ответ. Это было очень полезно. Поэтому я проголосовал за ваш ответ. (одно из 3 голосов пришло от меня). Тем не менее, ваш ответ не решил загадку полностью ... Следовательно, я не мог принять это как решение. посмотреть здесь:stackoverflow.com/questions/38995044/...
 BrunoLevy09 авг. 2016 г., 15:48
Не могли бы вы показать нам свой make-файл? -lX11 должен бытьпосле -lffmpeg
 Josh de Kock27 авг. 2016 г., 21:36
@ Kindermann Я пропустил ваше редактирование (это было через 8 дней после моего ответа). Попробуйте добавитьlibva-drm а такжеlibva-x11 в переменную PKG_CFG_LIBS.
 BrunoLevy10 авг. 2016 г., 17:01
Поменяйте местами $ (LIBS) и $ (LDLIBS) в строке 30 (как я уже сказал, -lX11 должен быть $ после $ -lffmpeg).
 Kindermann11 авг. 2016 г., 11:11
@ BrunoLevy ты прав! Я сталкиваюсь с вышеупомянутыми ошибками, когда компилятор все еще не может найти libva, хотя я уже установил его ...
 BrunoLevy09 авг. 2016 г., 14:13
большинство отсутствующих функций находятся в libX11 (отсутствует -lX11), для vaGetDisplay и vaGetDisplayDRM и vdp_device_create_X11 я не знаю. Попробуйте поискать их в Google или посмотреть, в какой библиотеке они определены.
 BrunoLevy11 авг. 2016 г., 10:56
Это немонтаж порядок, это порядок опций -lxxx в командной строке, отправляемых компоновщику, который имеет значение (-lva должен быть после -lffmpeg)

Ответы на вопрос(1)

Вам нужно связаться с библиотеками, которые предоставляют эти функции, а также FFmpeg.

Нужно добавить следующие флаги компоновщика (с соответствующими ошибками):

-lvdpau - libvdpau-DEV

/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vdpau.c:439: undefined reference to `vdp_device_create_x11'

-lva - libva-DEV

/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:896: undefined reference to `vaGetDisplay'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:917: undefined reference to `vaGetDisplayDRM'

-lX11 - libx11-DEV

/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:861: undefined reference to `XCloseDisplay'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vaapi.c:898: undefined reference to `XDisplayName'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vdpau.c:431: undefined reference to `XOpenDisplay'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vdpau.c:437: undefined reference to `XDisplayString'
/home/widerstand/ffmpeg_sources/ffmpeg/libavutil/hwcontext_vdpau.c:439: undefined reference to `XDefaultScreen'

Эти флаги должны быть добавлены после вашего-lav* флаги компоновщика.

Редактировать: OP добавил make-файл

Вы также можете использовать pkg-config для всех библиотек.

FFMPEG_LIBS=    libavdevice                        \
                libavformat                        \
                libavfilter                        \
                libavcodec                         \
                libswresample                      \
                libswscale                         \
                libavutil

PKG_CFG_LIBS=   x11                                \
                vdpau                              \
                libva                              \
                $(FFMPEG_LIBS)

TARGET = video_analysis
LIBS = -lm
CC = gcc
CFLAGS += -O2 -g -O0
CFLAGS := $(shell pkg-config --cflags $(PKG_CFG_LIBS)) $(CFLAGS)
LDLIBS := $(shell pkg-config --libs $(PKG_CFG_LIBS)) $(LDLIBS)

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -c 
FFMPEG_LIBS=    libavdevice                        \
                libavformat                        \
                libavfilter                        \
                libavcodec                         \
                libswresample                      \
                libswscale                         \
                libavutil

PKG_CFG_LIBS=   x11                                \
                vdpau                              \
                libva                              \
                $(FFMPEG_LIBS)

TARGET = video_analysis
LIBS = -lm
CC = gcc
CFLAGS += -O2 -g -O0
CFLAGS := $(shell pkg-config --cflags $(PKG_CFG_LIBS)) $(CFLAGS)
LDLIBS := $(shell pkg-config --libs $(PKG_CFG_LIBS)) $(LDLIBS)

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -c $< -o [email protected]

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) $(LIBS) $(LDLIBS) -o [email protected]

clean:
    -rm -f *.o
    -rm -f $(TARGET)
lt; -o [email protected] .PRECIOUS: $(TARGET) $(OBJECTS) $(TARGET): $(OBJECTS) $(CC) $(OBJECTS) $(LIBS) $(LDLIBS) -o [email protected] clean: -rm -f *.o -rm -f $(TARGET)
 laalaguer30 авг. 2016 г., 02:19
@JoshdeKock Ваш способ исправить ошибку компиляции / ссылки очень хорош. Получается, что «порядок» флагов на GCC также важен. Я разместил ответ на этот вопрос и в другой ветке.stackoverflow.com/questions/38995044/...
 Kindermann10 авг. 2016 г., 12:54
На самом деле, я установил самую новую версию libx11-dev раньше ... то же самое для libvdpau и libva ...
 Kindermann10 авг. 2016 г., 11:25
мой компилятор до сих пор жаловался на ту же ошибку, хотя я добавил флаги -lvdpau и -lva. см. выше makefile ...
 Josh de Kock10 авг. 2016 г., 19:13
Я обновил имена pkg-config
 Kindermann10 авг. 2016 г., 12:52
с вашим предложенным make-файлом я получил следующую ошибку: Пакет libx11 не найден в пути поиска pkg-config. Возможно, вам следует добавить каталог, содержащий `libx11.pc ', в переменную среды PKG_CONFIG_PATH. Пакет' libx11 'не найден.

Ваш ответ на вопрос