本文介绍了基于 RuyiSDK 搭建虚拟环境,通过配置 sysroot、安装并编译 SDL 系列等依赖,完成太空射击游戏 SDLShooter 的交叉编译与模拟运行。
开始
获取项目:
git clone https://github.com/WispSnow/SDLShooter.git
cd SDLShooter
创建虚拟环境
- 在项目路径下,在终端输入以下命令:
ruyi venv -t gnu-plct -e qemu-user-riscv-upstream generic ./gnu-plct-venv
制作 sysroot
由于游戏项目需要依赖 libxmp, SDL_mixer,SDL_ttf, SDL_image等,现在需要重新配置虚拟环境下的 sysroot
- 移除 sysroot 目录下的文件,防止冲突,注意当前所在的位置是克隆的项目目录下:
rm -rf $PWD/gnu-plct-venv/sysroot/*
- 在 Ubuntu 上安装必要依赖并初始化 sysroot:
sudo apt install -y qemu-user-static dnf
mkdir -p $PWD/gnu-plct-venv/sysroot/usr/bin
cp /usr/bin/qemu-riscv64-static $PWD/gnu-plct-venv/sysroot/usr/bin/
sudo dnf --installroot=$PWD/gnu-plct-venv/sysroot \
--forcearch=riscv64 \
--releasever=24.03 \
--repofrompath=oe-base,https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS/OS/riscv64/ \
--repofrompath=oe-update,https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS/update/riscv64/ \
--disablerepo=* --enablerepo=oe-base,oe-update \
--nogpgcheck \
--setopt=install_weak_deps=False \
install -y bash coreutils dnf openEuler-release
sudo cp /etc/resolv.conf $PWD/gnu-plct-venv/sysroot/etc/resolv.conf
- 调整sysroot权限:
sudo chown -R $USER:$USER $PWD/gnu-plct-venv/sysroot && sudo chown -R $USER:$USER $PWD/gnu-plct-venv/sysroot.riscv64-plct-linux-gnu
sudo chmod -R 775 $PWD/gnu-plct-venv/sysroot && sudo chmod -R 775 $PWD/gnu-plct-venv/sysroot.riscv64-plct-linux-gnu
- 进入 openEuler 安装依赖:
sudo chroot $PWD/gnu-plct-venv/sysroot /bin/bash
dnf install SDL2-devel freetype-devel libpng-devel wavpack-devel mesa-dri-drivers mesa-libGL-devel libX11-devel zlib-devel openssl-devel libXext-devel libXcursor-devel libXinerama-devel libXi-devel fluidsynth-devel opus-devel opusfile-devel libogg-devel wavpack-devel freetype-devel libpng-devel libjpeg-turbo-devel libwebp-devel libtiff-devel SDL2-static glibc-devel
dnf groupinstall -y "Development Tools"
如图出现如下面板:
手动编译一些依赖
手动创建设备文件,保证 openEuler 可以成功使用 git:
mknod -m 666 /dev/urandom c 1 9
mknod -m 666 /dev/random c 1 8
- 克隆手动编译依赖的源码:
mkdir PkgDownload && cd PkgDownload
# 克隆 libxmp 源码
git clone https://github.com/libxmp/libxmp.git
- 对于 SDL_mixer,SDL_ttf,SDL_image,同理进行克隆源码,注意执行命令的目录是在 PkgDownload 下~
git clone https://github.com/libsdl-org/SDL_mixer.git && cd SDL_mixer && git checkout SDL2
git clone https://github.com/libsdl-org/SDL_ttf.git && cd SDL_ttf && git checkout SDL2
git clone https://github.com/libsdl-org/SDL_image.git && cd SDL_image && git checkout SDL2
- 分别进入克隆的依赖的目录下,如
cd libxmp编译并安装:
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
make -j$(nproc)
make install
ldconfig
- 上面的4个依赖安装完成后,退出 bash 面板:
exit
- 更改配置文件:
cd $PWD/gnu-plct-venv/sysroot
#更改SDL2.config.cmake
find usr/lib64/cmake -name "*.cmake" -exec sed -i 's|"/usr|"${CMAKE_SYSROOT}/usr|g' {} +
编译并运行游戏项目
编译
进入游戏 SDLShooter 目录下:
mkdir build && cd build
# 先回到上一级
cd ..
# 直接构建
cmake -S . -B build \
-DCMAKE_TOOLCHAIN_FILE=$PWD/gnu-plct-venv/toolchain.cmake \
-DCMAKE_SYSROOT=$PWD/gnu-plct-venv/sysroot \
-DCMAKE_EXE_LINKER_FLAGS="-static-libstdc++ -static-libgcc"
cd ./build && make
运行游戏
- 激活虚拟环境:
cd ..
source ./gnu-plct-venv/bin/ruyi-activate
- 运行游戏:
env SDL_AUDIODRIVER=dummy LIBGL_ALWAYS_SOFTWARE=1 ruyi-qemu -L $PWD/gnu-plct-venv/sysroot ./build/SDLShooter-Linuxs
可能出现的问题
如果在编译游戏项目的过程中有如下报错:
需要把报错路径下的配置文件中的参数改为如下图所示:



