将我的ubuntu操作系统从14.04更新到16.04后,我使用以下配置安装了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
make install
在我看来,安装过程还可以。之后,我尝试使用以下Makefile编译自己的C源代码:
EDITTED (在第10行添加-lva-drm -lva-x11)
FFMPEG_LIBS= libavdevice \
libavformat \
libavfilter \
libavcodec \
libswresample \
libswscale \
libavutil \
TARGET = video_analysis
LIBS = -lva -lX11 -lvdpau -lm -lva-drm -lva-x11
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 $@
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) $(LDLIBS) $(LIBS) -o $@
clean:
-rm -f *.o
-rm -f $(TARGET)
但是,我的编译器抱怨了以下错误:
/root/ffmpeg_build/lib/libavutil.a(hwcontext_vaapi.o): In function `vaapi_device_create':
/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'
collect2: error: ld returned 1 exit status
Makefile:30: recipe for target 'video_analysis' failed
make: *** [video_analysis] Error 1
我的问题是:在哪个图书馆做“vaGetDisplay”&#39;和'vaGetDisplayDRM&#39;存在?确保libva正常运行是正确的。我不知道如何修复错误...提前谢谢你!
答案 0 :(得分:3)
当我尝试编译最新的ffmpeg源代码示例时,我遇到了完全相同的问题。 (2016年8月25日)
当我编译ffmpeg源码时,(所有依赖项都很好),然后我去了dir:
~/ffmpeg_build/share/ffmpeg/examples$
做的:
export PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig"
并按照README:
的指示make
我将C文件编译为.o文件但无法链接。输出的错误与:
相同jack@jack-virtual-machine:~/ffmpeg_build/share/ffmpeg/examples$ make
cc avio_reading.o -pthread -L/home/jack/ffmpeg_build/lib -lavdevice -lavfilter -lpostproc -lavformat -lavcodec -lvdpau -lva-drm -lva-x11 -lva -lxcb-shm -lxcb-xfixes -lxcb-render -lxcb-shape -lxcb -lXau -lXdmcp -lSDL -lasound -lpulse-simple -lpulse -lX11 -lXext -lcaca -lx265 -lstdc++ -lrt -lx264 -ldl -lvpx -lpthread -lvorbisenc -lvorbis -ltheoraenc -ltheoradec -logg -lopus -lmp3lame -lfdk-aac -lass -lharfbuzz -lfontconfig -lfribidi -lexpat -lfreetype -lpng12 -llzma -lbz2 -lz -lswresample -lswscale -lavutil -lm -o avio_reading
/home/jack/ffmpeg_build/lib/libavutil.a(hwcontext_vaapi.o): In function `vaapi_device_free':
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vaapi.c:861: undefined reference to `XCloseDisplay'
/home/jack/ffmpeg_build/lib/libavutil.a(hwcontext_vaapi.o): In function `vaapi_device_create':
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vaapi.c:891: undefined reference to `XOpenDisplay'
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vaapi.c:896: undefined reference to `vaGetDisplay'
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vaapi.c:903: undefined reference to `XDisplayName'
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vaapi.c:917: undefined reference to `vaGetDisplayDRM'
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vaapi.c:893: undefined reference to `XDisplayName'
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vaapi.c:898: undefined reference to `XDisplayName'
/home/jack/ffmpeg_build/lib/libavutil.a(hwcontext_vdpau.o): In function `vdpau_device_create':
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vdpau.c:431: undefined reference to `XOpenDisplay'
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vdpau.c:437: undefined reference to `XDisplayString'
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vdpau.c:439: undefined reference to `XDefaultScreen'
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vdpau.c:439: undefined reference to `vdp_device_create_x11'
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vdpau.c:433: undefined reference to `XDisplayName'
/home/jack/ffmpeg_build/lib/libavutil.a(hwcontext_vdpau.o): In function `vdpau_device_free':
/home/jack/ffmpeg_source/FFmpeg/libavutil/hwcontext_vdpau.c:410: undefined reference to `XCloseDisplay'
collect2: error: ld returned 1 exit status
make: *** [avio_reading] Error 1
我在这里检查了你的解决方案并发现虽然ffmpeg团队正在使用
pkg-config
工具来配置,但最后它是一个gcc
命令行来编译。 (参见上面代码片段的第二行)
以下所有标志都应移至gcc
选项之前-o
命令行的末尾:
-lX11 -lm -lvdpau -lva -lva-drm -lva-x11
所以 而不是 使用下一个命令行进行编译:(命令很长,滚动到右边看完整)
cc avio_reading.o -pthread -L/home/jack/ffmpeg_build/lib -lavdevice -lavfilter -lpostproc -lavformat -lavcodec -lvdpau -lva-drm -lva-x11 -lva -lxcb-shm -lxcb-xfixes -lxcb-render -lxcb-shape -lxcb -lXau -lXdmcp -lSDL -lasound -lpulse-simple -lpulse -lX11 -lXext -lcaca -lx265 -lstdc++ -lrt -lx264 -ldl -lvpx -lpthread -lvorbisenc -lvorbis -ltheoraenc -ltheoradec -logg -lopus -lmp3lame -lfdk-aac -lass -lharfbuzz -lfontconfig -lfribidi -lexpat -lfreetype -lpng12 -llzma -lbz2 -lz -lswresample -lswscale -lavutil -lm -o avio_reading
我将 标志移到右侧 并使用以下命令编译:(命令很长,向右滚动以查看完整)
cc avio_dir_cmd.o -pthread -L/home/jack/ffmpeg_build/lib -lavdevice -lavfilter -lpostproc -lavformat -lavcodec -lxcb-shm -lxcb-xfixes -lxcb-render -lxcb-shape -lxcb -lXau -lXdmcp -lSDL -lasound -lpulse-simple -lpulse -lXext -lcaca -lx265 -lstdc++ -lrt -lx264 -ldl -lvpx -lpthread -lvorbisenc -lvorbis -ltheoraenc -ltheoradec -logg -lopus -lmp3lame -lfdk-aac -lass -lharfbuzz -lfontconfig -lfribidi -lexpat -lfreetype -lpng12 -llzma -lbz2 -lz -lswresample -lswscale -lavutil -lX11 -lm -lvdpau -lva -lva-drm -lva-x11 -o avio_dir_cmd
所有编译错误都消失了〜! 我认为当我们编译其他示例或我们自己的项目时,这是一个常见的错误。
答案 1 :(得分:0)
将-lva-drm和-lva-x11添加到Makefile后,我的编译器不再抱怨错误: - )