作为一个长期使用openSUSE的开发者,我深知在这个发行版上编译软件时遇到的各种依赖问题有多么令人头疼。特别是像mpv这样功能强大的播放器,虽然官方提供了源码编译的指南,但在实际执行过程中总会遇到一些发行版特有的障碍。最近我在Tumbleweed上编译mpv 0.34.1版本时就遇到了经典的xscrnsaver.pc缺失问题,经过一番探索终于找到了完美的解决方案。本文将详细记录整个过程,帮助遇到同样问题的开发者少走弯路。
在开始编译mpv之前,我们需要确保系统已经安装了所有必要的开发工具和依赖库。openSUSE与其他发行版在包管理上有些许不同,使用zypper命令可以高效地完成这些准备工作。
首先更新系统并安装基础开发工具链:
bash复制sudo zypper refresh
sudo zypper update -y
sudo zypper in -y patterns-devel-base-devel_basis gcc-c++ make cmake
接下来安装mpv编译所需的依赖库。根据官方文档和实际经验,以下包是必须的:
bash复制sudo zypper in -y libass-devel libbluray-devel libdvdnav-devel \
libdvdread-devel libva-devel libvdpau-devel \
libvorbis-devel libtheora-devel libopus-devel \
libx264-devel libx265-devel libmp3lame-devel \
ffmpeg-4-libavcodec-devel ffmpeg-4-libavformat-devel \
ffmpeg-4-libswscale-devel ffmpeg-4-libavutil-devel \
ffmpeg-4-libswresample-devel
特别需要注意的是X11相关依赖,这正是我们后续会遇到问题的地方:
bash复制sudo zypper in -y libX11-devel libXext-devel libXinerama-devel \
libXrandr-devel libXss-devel libXpresent-devel \
libXv-devel
提示:在openSUSE中,开发包通常以
-devel后缀命名,而主库包则没有这个后缀。确保安装的是开发版本而非仅运行时版本。
现在我们可以开始获取mpv的源代码了。建议直接从官方GitHub仓库克隆最新稳定版本:
bash复制git clone https://github.com/mpv-player/mpv.git
cd mpv
git checkout v0.34.1
初始化编译环境:
bash复制./bootstrap.py
这一步会生成waf构建脚本。如果一切顺利,你应该能看到类似以下的输出:
code复制Setting up mpv version 0.34.1 (release)
Creating config.h...
Creating osdep/talloc.h...
Creating osdep/threads.h...
Creating osdep/timer.h...
Creating osdep/io.h...
Creating osdep/endian.h...
Creating osdep/atomic.h...
Creating osdep/subprocess.h...
Creating osdep/terminal.h...
Creating osdep/glob-win.h...
Creating osdep/glob-posix.h...
Creating osdep/path-win.h...
Creating osdep/path.h...
Creating osdep/mpv.rc...
当我们尝试运行配置命令时,就会遇到那个令人头疼的错误:
bash复制./waf configure --prefix=/usr
错误信息通常会包含类似以下内容:
code复制INFO:cfg:err: Package xscrnsaver was not found in the pkg-config search path.
Perhaps you should add the directory containing `xscrnsaver.pc' to the PKG_CONFIG_PATH environment variable
No package 'xscrnsaver' found
这个错误表明pkg-config无法找到xscrnsaver.pc文件。在openSUSE中,这个文件实际上是由libXss-devel包提供的,但为什么系统找不到它呢?
首先确认文件是否确实存在于系统中:
bash复制find /usr -name "xscrnsaver.pc"
如果命令返回空,说明文件确实不存在,我们需要重新安装相关包:
bash复制sudo zypper in -f libXss-devel
如果文件存在但不在pkg-config的搜索路径中,我们可以手动指定路径。先找出文件的确切位置:
bash复制sudo zypper se -s xscrnsaver.pc
或者更直接地:
bash复制rpm -ql libXss-devel | grep xscrnsaver.pc
假设文件位于/usr/lib64/pkgconfig/xscrnsaver.pc,我们可以临时设置环境变量:
bash复制export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:$PKG_CONFIG_PATH
为了让这个设置在每次登录时都生效,我们可以将其添加到shell配置文件中:
bash复制echo 'export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:$PKG_CONFIG_PATH' >> ~/.bashrc
source ~/.bashrc
对于使用zsh的用户:
bash复制echo 'export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:$PKG_CONFIG_PATH' >> ~/.zshrc
source ~/.zshrc
注意:在openSUSE中,32位和64位库的路径可能不同。如果上述路径不适用,尝试使用
/usr/lib/pkgconfig或/usr/share/pkgconfig。
解决了依赖问题后,我们可以继续完成mpv的编译和安装过程。
运行配置命令,这次应该能顺利通过:
bash复制./waf configure --prefix=/usr
成功配置的输出应该类似于:
code复制Setting prefix to '/usr'
Checking for program 'gcc' : /usr/bin/gcc
Checking for program 'ar' : /usr/bin/ar
Checking for program 'ranlib' : /usr/bin/ranlib
Checking for gcc : ok
Checking for library dl : yes
Checking for X11 : yes
...
'configure' finished successfully (1.123s)
使用waf进行构建:
bash复制./waf build -j$(nproc)
-j$(nproc)选项会使用所有可用的CPU核心进行并行编译,显著加快构建速度。构建过程可能需要几分钟时间,具体取决于你的系统性能。
构建完成后,安装到系统:
bash复制sudo ./waf install
这将把mpv安装到/usr/bin目录下,同时安装相关的文档和手册页。
安装完成后,验证mpv是否正常工作:
bash复制mpv --version
应该输出类似以下信息:
code复制mpv 0.34.1 Copyright © 2000-2022 mpv/MPlayer/mplayer2 projects
built on UNKNOWN
ffmpeg library versions:
libavutil 56.70.100
libavcodec 58.134.100
libavformat 58.76.100
libswscale 5.9.100
libavfilter 7.110.100
libswresample 3.9.100
ffmpeg version: 4.4.1
如果遇到任何问题,可以尝试以下排查步骤:
bash复制ldd $(which mpv)
bash复制less build/config.log
bash复制./waf distclean
./waf configure --prefix=/usr
./waf build
mpv提供了丰富的配置选项,我们可以通过创建配置文件来定制其行为:
bash复制mkdir -p ~/.config/mpv
touch ~/.config/mpv/mpv.conf
以下是一些常用的配置选项:
ini复制# 启用硬件加速
hwdec=auto-safe
# 提高缓存大小
cache=yes
demuxer-max-bytes=500MiB
demuxer-max-back-bytes=100MiB
# 字幕设置
sub-auto=fuzzy
sub-file-paths=subs:subtitles
# 音频输出设置
audio-channels=auto
audio-normalize-downmix=yes
对于openSUSE用户,还可以考虑安装额外的编解码器支持:
bash复制sudo zypper in -y ffmpeg-4-libavcodec-extra ffmpeg-4-libavdevice-devel
如果直接编译mpv遇到太多问题,可以考虑使用mpv-build工具链。这种方法会自动处理大部分依赖关系,简化编译过程。
首先安装必要的工具:
bash复制sudo zypper in -y git ninja meson
然后获取mpv-build源码:
bash复制git clone https://github.com/mpv-player/mpv-build.git
cd mpv-build
初始化并构建:
bash复制./update
./build -j$(nproc)
安装到系统:
bash复制sudo ./install
提示:mpv-build会下载并构建所有依赖项,包括ffmpeg,因此整个过程会比直接编译mpv耗时更长,但通常能避免依赖问题。