☰
openEuler 源码编译 VLC 全流程:依赖、configure 与 ffmpeg 兼容实战
2026/10/18 5:59:08 网站建设 项目流程

在 Linux 环境里自己编译 VLC,算是既经典又含金量很高的实操项目。我在 openEuler 系统上完整跑过一遍从源码获取、编译、安装到调试验证的流程,中间踩了不少坑,也积累了一些可以复用的方法。这篇文章就把完整过程记录下来,包括依赖怎么梳理、configure 参数怎么调、ffmpeg 版本不兼容怎么办、动态库加载失败如何修复等。如果你正准备在一台干净或已有业务的开源 Linux 服务器上测试编译 VLC,可以直接照着走一遍。

1. 编译前的整体规划与依赖环境准备

1.1 为什么要自己编译 VLC

很多发行版的软件仓库里根本没有 VLC,或者版本陈旧。openEuler 这类面向服务器场景的系统,默认源往往只维护系统组件和基础服务,桌面播放器基本不在收录范围内,dnf search vlc经常直接返回无结果。就算能找到二进制包,版本也比上游落后很多,而且无法定制。

源码编译带来的实际收益很直接:

  • 拿到最新版本:VLC 官方发布页面会提供最新的tar.xz源码包,编译安装后版本号完全可控。
  • 灵活裁剪:VLC 是一个庞大的模块化项目,解封装、解码器、音频输出、网络协议、界面统统是独立模块。通过 configure 参数可以禁用不需要的部分,减少编译时间和运行时体积。
  • 依赖可控:可以绑定特定版本的 ffmpeg、x264 等基础库,避免系统包升级导致的不兼容。
  • 排查原理级问题:编译过程等于把 VLC 的模块依赖关系整个串了一遍,对后续做二次开发或集成非常有帮助。

如果你平时用 apt 或 yum 装软件比较多,那第一次源码编译 VLC 后,会对 Linux 生态里的“依赖树”“动态链接”“pkg-config 机制”有一个非常直观的认识。

1.2 确认基础环境与版本差异

编译前第一步不是急着装依赖,而是先确认系统版本、架构、可用磁盘和内存。

cat /etc/openEuler-release uname -m free -h df -h

我建议在 x86_64 架构下操作,教程和依赖兼容性都最成熟。如果是在 aarch64(ARM64)机器上,下面提到的部分 RPM 包可能没有直接对应版本,要么从源码编依赖,要么在 configure 阶段果断禁用相关功能模块。

磁盘空间建议至少预留 5GB,编译过程产生的临时.o文件和中间产物很占空间。内存方面,VLC 编译对内存要求不算极端,但make -j并发太高时可能直接 OOM,稳妥的做法是先看物理内存大小再决定并发数。

1.3 安装编译工具链

openEuler 默认使用 dnf 作为包管理器,如果你的系统是最小化安装,还需要自己装编译工具链。工具链是后面所有步骤的地基,缺少任何一个都可能让 configure 阶段直接报错。

sudo dnf install -y dnf-plugins-core sudo dnf group install -y "Development Tools"

如果group install因为镜像源或组名问题没有执行成功,可以改成逐个安装:

sudo dnf install -y gcc gcc-c++ make autoconf automake libtool cmake pkgconf

这里有一个容易忽略的细节:VLC 使用 autotools 体系构建,libtool是必需品。很多新手只安装了 gcc,结果运行./configure的时候提示:

configure: error: C compiler cannot create executables

一看就是缺少glibc-devel或libtool,这种报错往往和编译器本身无关,是周边工具链不完整。安装完工具链后,建议先快速验证一遍:

gcc --version libtoolize --version pkg-config --version

这三个命令都能正常回显版本号,再进入下一步。

2. VLC 依赖库:装哪些、怎么装、哪些可以不装

2.1 VLC 的依赖树与最小集合

VLC 的依赖非常庞大,如果不加选择地全装,光依赖软件包就得几十个。但实际编译不需要“全家桶”,只装核心子集即可。我在实际操作中把依赖分成四个层次:

依赖类别典型软件包作用
基础库glib2-devel、zlib-devel、libgcrypt-devel字符串处理、压缩、加密基础能力
界面相关qt5-qtbase-devel、qt5-qttools-devel构建 Qt 图形界面(无桌面可不装)
音视频核心ffmpeg-devel、x264-devel、x265-devel、libvpx-devel、dav1d-devel解码、编码、格式转换
音频输出alsa-lib-devel、pulseaudio-libs-devel音频设备访问与混音

如果你主要目的是“测试编译”,而不是做完整的桌面播放器,可以不装 Qt 相关库,去掉 GUI 模块后依赖压力会小很多。

2.2 使用 dnf 安装核心依赖

在 openEuler 上,我的实际安装命令如下:

sudo dnf install -y glib2-devel zlib-devel libgcrypt-devel \ alsa-lib-devel pulseaudio-libs-devel \ qt5-qtbase-devel qt5-qttools-devel \ ffmpeg-devel x264-devel x265-devel \ libvpx-devel dav1d-devel \ libarchive-devel lua-devel

如果你只需要最小支持,可以砍掉 Qt 和部分编码库,只保留:

sudo dnf install -y glib2-devel zlib-devel libgcrypt-devel

但注意,VLC 的 configure 默认启用“自动检测”,检测不到相关依赖会自动降级或禁用对应模块。为了测试解码能力,ffmpeg-devel建议保留,因为 VLC 的 h264、h265、aac 等解封装和解码插件都依赖它。

2.3 最关键的 ffmpeg 版本关系处理

在 Linux 上编译 VLC 最容易翻车的不是 VLC 本身,而是 ffmpeg。VLC 的 avcodec 插件封装了 ffmpeg 的 API,上游对版本兼容性维护滞后,导致“高版本 ffmpeg 编译 VLC 报错”几乎成了每个 Linux 发行版用户都会遇到的经典坑。

VLC 3.0.x 系列发布时主要针对 ffmpeg 4.x 分支开发,如果 openEuler 源里自带的是 ffmpeg 5 或更高版本,编译时大概率遇到类似错误:

error: 'AVCodecParameters' has no member named 'codec'

这类 API 变动是 ffmpeg 大版本重构引起的。处理思路有三种:

  • 降低系统 ffmpeg 版本:把 openEuler 自带 ffmpeg 卸载,手动编译安装 ffmpeg 4.4,再用PKG_CONFIG_PATH指向它。
  • 与 VLC 版本匹配:直接使用 VLC 官方推荐搭配的 ffmpeg 版本,例如 VLC 3.0.20 搭配 ffmpeg 4.4。
  • 关掉不兼容插件:如果只是测试编译流程,不关心最新解码能力,可以先--disable-avcodec跳过问题模块,后续再单独处理。

我建议先查一下当前源里的 ffmpeg 版本:

dnf info ffmpeg

如果显示版本号是 4.2 或 4.4,那基本可以直接用;如果版本过新,就按第 3 章的兼容方案处理。

3. 源码获取、configure 配置与编译参数调整

3.1 下载源码与完整性校验

VLC 官方发布站提供源码包,建议直接下载 LTS 版本或最新稳定版本。以 3.0.20 为例:

wget https://get.videolan.org/vlc/3.0.20/vlc-3.0.20.tar.xz sha256sum vlc-3.0.20.tar.xz

下载完成后,解压进入源码目录:

tar -xf vlc-3.0.20.tar.xz cd vlc-3.0.20

如果是从 Git 仓库拉取的源码,还需要额外执行一次:

./bootstrap

这个脚本会生成 configure 文件和一系列 autotools 中间文件,是 Git 源码特有的步骤。发行版 tar 包通常已经包含 configure,可以直接跳到下一步。

3.2 configure 核心参数与推荐组合

VLC 的 configure 脚本参数特别多,直接./configure不带参数也能跑,默认会启用自动检测。但实际测试编译时,我习惯显式指定前缀和关键模块,方便后续管理产物。

./configure \ --prefix=/usr/local/vlc \ --enable-qt \ --enable-avcodec \ --enable-avformat \ --enable-swscale \ --disable-lua \ --disable-gnutls

参数含义拆解:

  • --prefix=/usr/local/vlc:指定安装目录,不污染系统/usr。后续要清理时直接删除这个目录即可。
  • --enable-qt:启用 Qt 图形界面。如果没装 Qt 开发包,这个选项会导致 configure 报错,此时去掉该参数即可。
  • --enable-avcodec、--enable-avformat、--enable-swscale:这三个是和 ffmpeg 对接的关键插件,建议显式启用,确保 configure 阶段能检测出 ffmpeg 依赖是否齐备。
  • --disable-lua:lua 是可选扩展脚本支持,测试阶段没必要,禁掉减少编译时间。
  • --disable-gnutls:实时流媒体加密传输支持,测试环境下可先禁用。

configure 运行结束后,重点关注最后输出的摘要部分。VLC 会把“启用/禁用”的模块列表汇总出来,建议瞄一眼avcodec、qt是否显示yes,如果是no,说明对应的依赖还是没有找到,后续即使编译通过,功能也是残缺的。

3.3 构建加速与裁剪技巧

VLC 模块很多,全量编译在一台普通配置的虚拟机上可能要 30 分钟以上。如果配置不高或时间赶,可以做三点优化:

  • 只保留必要模块,用--disable-*关掉不需要的组件,比如--disable-vdpau、--disable-dvdread、--disable-bluray、--disable-ncurses、--disable-jack。
  • 安装ccache,让重复编译时直接命中缓存:
sudo dnf install -y ccache export CC="ccache gcc"
  • 编译并行度根据内存调整,不要盲目make -j$(nproc)。4GB 内存的机器建议make -j4,8GB 以上再尝试make -j8。

4. 编译、安装与验证

4.1 并行编译与资源控制

configure 通过后,进入编译环节:

make -j4

如果内存不太宽裕,遇到编译进程被杀掉的情况,检查dmesg有没有 OOM 记录,改小并行度再重跑。注意编译中断后重新执行make可以断点续编,不用从头开始。

编译过程中会有大量警告信息,大多是 Werror 未开启的提示,不会中断构建。真正需要关注的是Error字样。VLC 代码量大,头文件互相引用复杂,有时候单个.c文件编译失败不代表全局失败,先看完整报错再做判断。

4.2 make install 与动态库路径

编译完成后安装到指定目录:

sudo make install

我上面用了--prefix=/usr/local/vlc,所以安装后二进制在/usr/local/vlc/bin/vlc,库文件在/usr/local/vlc/lib。这个路径不在系统默认的库搜索路径里,直接运行vlc大概率报错:

vlc: error while loading shared libraries: libvlc.so.5: cannot open shared object file

这不是安装失败,而是动态库路径问题。两种解决办法:

# 临时生效 export LD_LIBRARY_PATH=/usr/local/vlc/lib:$LD_LIBRARY_PATH # 永久生效 echo "/usr/local/vlc/lib" | sudo tee /etc/ld.so.conf.d/vlc.conf sudo ldconfig

推荐第二种,写入配置文件后执行ldconfig,系统会在缓存里建立软链接,后续就不会再出现找不到库的问题。

4.3 命令行验证与图形界面说明

安装完成后,先验证版本:

/usr/local/vlc/bin/vlc --version

如果 configure 时启用了 Qt,而当前环境没有桌面显示器,直接运行vlc会报无法连接显示服务器。对服务器场景和容器环境,更合理的是用无界面模式测试:

/usr/local/vlc/bin/vlc -vv --intf dummy /path/to/sample.mp4 --no-audio

-vv输出详细日志,--intf dummy不加载图形界面,--no-audio跳过音频输出设备。如果日志末尾出现stream out、decoder相关提示且没有致命错误,说明核心解码链路已经工作。把sample.mp4换成自己准备的小体积测试文件即可。

有桌面环境或者通过 X11 转发测试图形界面时,直接运行vlc就能打开窗口,这时可以验证视频渲染、快捷键、播放列表等交互功能。

5. 常见问题与排查心得

5.1 configure 阶段错误通用排查方法

configure 阶段的报错排在所有问题第一位,也是最容易卡住新手的环节。常见情况如下:

现象可能原因解决办法
C compiler cannot create executables工具链不完整,缺 gcc 或 glibc-devel安装 Development Tools 组,确认 gcc 可用
checking for ffmpeg... no缺少 ffmpeg-devel安装 ffmpeg-devel,或检查 pkg-config 路径
Qt5 not found缺少 Qt5 开发包安装 qt5-qtbase-devel,或去掉--enable-qt
libgcrypt not found缺少加密库开发包安装 libgcrypt-devel,或--disable-gcrypt

排查这类问题有个通用心法:configure是一个 bash 脚本,它会调用pkg-config和cc做一些“探测程序能否编译”的小实验,如果找不到依赖,会在config.log里留下详细诊断信息。遇到报错先不要猜,直接打开config.log搜索最近的error,通常能定位到具体是缺头文件还是缺库。

5.2 ffmpeg API 不兼容的经典报错

排除掉路径问题后,真正棘手的是 ffmpeg 版本不兼容。比如 openEuler 源里的 ffmpeg 版本较新,VLC 源码里的 avcodec 插件还是按旧 API 写的,编译时会出现:

error: too few arguments to function 'avcodec_open2' error: 'AVStream' has no member named 'codec'

这种问题的本质是 ffmpeg 在 5.0 后彻底移除了旧的AVStream.codec字段,而 VLC 3.0 的代码还在使用该字段。这里给两条稳妥路线:

  • 同版本编译方案:自己编译 ffmpeg 4.4,源码下载后执行常规三步./configure && make -j4 && sudo make install,默认安装到/usr/local,再用环境变量让 VLC 优先发现它:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/vlc/lib/pkgconfig export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/vlc/lib
  • 快速绕过方案:如果只是测试编译和基础播放,先--disable-avcodec禁用该模块,编译出可运行的 VLC,之后再单独研究解码扩展。这样可以先打通整体流程,避免在依赖版本上耗太久。

5.3 运行时报缺少共享库

编译安装成功,一运行却报cannot open shared object file,这个问题我已经在 4.2 节提过,核心就是系统搜索不到自定义路径下的动态库。用-prefix指定非默认目录的安装方式尤其容易触发。

检查手段:

ldd /usr/local/vlc/bin/vlc | grep "not found"

这句命令会列出所有找不到的依赖库,哪个缺失一目了然。修复后重新ldconfig,再次ldd确认,直到没有not found输出。

另外要注意:如果系统同时存在多个 VLC 相关库,运行时可能加载到错误的.so文件。可以用ldd查看实际加载路径,确认来源是/usr/local/vlc/lib而不是其它目录。

5.4 几个提升效率的编译细节

编译这种大型项目,多留个心眼能省很多时间:

  • 改完 configure 参数后,记得先执行make clean再重新编译,否则旧的.o文件可能会残留,导致新配置不生效。
  • 源码目录不要放在网络挂载盘或虚拟共享目录上,本地磁盘编译能显著减少 I/O 等待。
  • 如果编译中断过,重新make前先看错误日志,避免盲目重启全量编译。
  • 给编译环境预留交换分区,低内存机器在并行编译时不容易直接 OOM。

我在实际测试中还有一个体会:VLC 的编译输出非常冗长,但绝大多数是模块内警告。真正需要留意的只有三种情况——error:、undefined reference、以及 configure 摘要里的关键模块项是no。把注意力放在这三个点上,整个编译过程就不会觉得乱。

如果后续要在多个机器上重复部署,建议把已经编译好的/usr/local/vlc目录打包,配合统一的ld.so.conf配置直接分发,能省掉每台机器重新编译的时间。这个流程在内部环境验证过多次,稳定性和可控性都比反复源码编译要好。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询