开源掌机程序编译

主要记录一些开源软件的跨平台编译:TriForceX/MiyooCFW

热知识

  1.arm架构一般新兼容旧,比如armv6就支持armv5(一般情况下,arm-gcc编译出来的程序,所有arm32以上架构都通用,除非用的gcc不是通用arm,而是指定版本的例如armv6)

  2.所以miyoo(v5)编译出来的程序,树莓派(v6)可以直接运行。不过需要注意的是,有的miyoo程序是通过精简C库(uClibc 或 musl)编译的,树莓派里直接运行可能会因为缺少链接库而出错。

  3.x86的window的wsl内置虚拟化技术,可以直接运行arm程序(但是不少arm程序依赖了各种arm库,可能没法直接运行,可以编译成静态的-static

  4.但对于不是wsl的其他x86平台,可以通过qemu-static跟binfmt来模拟运行arm架构,参考Linux学习笔记(树莓派/嵌入式) - JeasonBoy - 博客园 (cnblogs.com) (117条)

  5.miyoo sdk的musl版本默认是静态编译的,所以编译好的程序能直接在树莓派或者wsl里运行,但是uClibc版本默认是动态链接的,并且uClibc库缺少静态链接库,导致无法静态编译

    解决方法:

      1.手动把miyoo sdk的动态库链接给系统,就能直接运行uClibc编译的程序了

      2.先确认miyoo sdk已经放到了/opt/下面:

        sudo ln -s /opt/miyoo/arm-miyoo-linux-uclibcgnueabi/sysroot/lib/* /lib/

        sudo ln -s /opt/miyoo/arm-miyoo-linux-uclibcgnueabi/sysroot/usr/lib/* /lib/

 

跨平台编译miyoo程序,需要有miyoo的sdk(跨平台编译器和各种链接库等),下面1跟2的区别就是,1是gcc工具而已,而2在1的基础上增加了一些sdk,例如sdl,sound等常用库

  1.musl或uclibc跨平台编译工具链的获取方式:Linux学习笔记(树莓派/嵌入式) - JeasonBoy - 博客园 (cnblogs.com)  (135条)

  2.miyoo的sdk获取方式有多种,官方链接:Making Games · TriForceX/MiyooCFW Wiki (github.com)

注意:有些项目代码写的不够好,跟SDK工具绑定太多,导致不同版本的sdk(uclibc或musl)可能会出现编译错误,甚至同一个c库uclibc,用最新的官方跟用司徒的旧sdk,都不一样。所以如果编译失败,换个sdk试试。

a.手动编译(太慢了不推荐):

sudo mkdir /opt/miyoo
cd /opt/miyoo
sudo git clone https://github.com/MiyooCFW/toolchain.git
cd toolchain
make sdk  //注意,这里记得切换成root账号编译,否则在config的时候会出错,编译的过程会很久,会下载一些库,可能网络不好会卡住
sudo mv /opt/miyoo/toolchain/output/host/* /opt/miyoo/
然后就可以正常编译其他程序到miyoo了,至于怎么引用miyoo sdk,上面的官方wiki里有,不少miyoo的项目,都可以直接make -f Makefile.miyoo来编译,会自动识别/opt/miyoo文件夹来定位编译器

b.下载官方编译好的sdk,手动放到/opt/miyoo文件夹:

Releases · MiyooCFW/toolchain (github.com)下载:https://github.com/MiyooCFW/toolchain/releases/download/v2.0.0/miyoo-toolchain-v2.0.0-arm-buildroot-linux-musleabi_sdk-buildroot.tar.gz

解压,把文件夹名字改为miyoo,移到/opt/目录下,最终目录应该是类似这样的:/opt/miyoo/arm-buildroot-linux-musleabi/... 

为自己的程序编译的时候,可以设置环境变量来指定用miyoo sdk来跨平台编译
CROSS_ROOT=/opt/miyoo CROSS_TRIPLE=arm-buildroot-linux-musleabi SYSROOT="${CROSS_ROOT}/${CROSS_TRIPLE}/sysroot" PATH="${CROSS_ROOT}/bin:${SYSROOT}/usr/bin:${PATH}" ARCH=arm CROSS_COMPILE="${CROSS_TRIPLE}-"

c.手动创建docker项目(很慢)

原理大致就是直接创建一个Dockefile,引用与debian系统,然后把miyoo的sdk解压进入,创建一个拥有sdk的镜像文件

我自己创建一个github项目了:jeason1997/MiyooSDK: 可以编译横米miyoo程序的docker 🐳 Docker environment for developing Miyoo Linux apps. (github.com)

用起来也很简单,就是先运行:./install.sh,生成一个docker镜像,然后./run.sh运行起来测试生成的镜像能否正常编译demo程序

其实我已经创建好docker镜像并上传到hub了,直接拉取就行:docker pull jeason1997/miyoo_sdk

然后:sudo docker run -it --rm -v "$(pwd)":/root -w /root  jeason1997/miyoo_sdk make  (跟下面的官方docker一个用法)

或者:sudo docker run -it --rm -v "$(pwd)":/root -w /root jeason1997/miyoo_sdk /opt/miyoo/bin/arm-linux-gcc test.c -lc (直接指定arm的gcc编译,但记得加上-lc,指定标准C库编译)

d.用官方的docker项目(推荐)

由于标准C太大,所以嵌入式设备一般用精简C,有常用两种:

musl:兼容性更好,性能高

uclibc:更精简,简洁,体积小

docker pull miyoocfw/toolchain:2.0.0  (默认是musl)

docker pull miyoocfw/toolchain-shared-uclibc (uclibc版本)

然后进入到要编译的项目目录下:

sudo docker run -it --rm -v "$(pwd)":/root -w /root miyoocfw/toolchain:2.0.0 make

这行命令的意思是:让docker以一个叫miyoocfw/toolchain:2.0.0的镜像运行一个容器,并且-d在后台运行的无头模式,--rm运行结束后直接删除,不保留容器,-v将当前的目录挂载到容器里的root目录下,并且进入容器后以root为工作目录,并且执行make命令

结果就是当前目录的源码,在运行这条命令后,会被容器里的sdk编译,并将编译后的程序保留在当前目录下。很方便

 e.用司徒大神的sdk文件(推荐)Release miyoo · steward-fu/archives (github.com)

 先下载并解压到/opt/下:https://github.com/steward-fu/archives/releases/download/miyoo/env_toolchain.7z (备份在百度云)

然后跟上面的SDK一样使用即可。

 

 

1.mgba:一个性能比较强的gba模拟器,支持SDL跟QT

linux编译:

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
make
sudo make install

不过不知道为啥,Lua5.1的路径总是找不到,即使安装了,导致编译报错,解决方法是把Lua去掉:cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DUSE_LUA=OFF ..

 依赖:

Qt 5: for the GUI frontend. Qt Multimedia or SDL are required for audio.
SDL: for a more basic frontend and gamepad support in the Qt frontend. SDL 2 is recommended, but 1.2 is supported.
zlib and libpng: for screenshot support and savestate-in-PNG support.
libedit: for command-line debugger support.
ffmpeg or libav: for video, GIF, WebP, and APNG recording.
libzip or zlib: for loading ROMs stored in zip files.
SQLite3: for game databases.
libelf: for ELF loading.
Lua: for scripting.
json-c: for the scripting storage API.

运行:

mgba game.gbc  // 默认sdl版本

mgba-qt game.gbc //qt版本(有菜单)

 

 

2.gmenu2x:一个嵌入式设备用的轻量级菜单UI

编译:

make -f Makefile.miyoo        //构建miyoo平台的bin文件
make -f Makefile.miyoo dist    //构建miyoo平台的发布项目,会生成一个文件夹,包括gmenu2x需要用到的各种资源文件
注意,以上miyoo平台的构建需要有miyoo的sdk,毕竟是跨平台编译,需要跨平台编译器


linux通用编译:安装依赖:

  sudo apt-get install -y build-essential libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libboost-all-dev libfreetype6-dev libbz2-dev libmpg123-dev

  make -f Makefile.linux dist

 最近更新把Makefile.linux改为Makefile了:

make dist

运行:

cd dist/linux
./gmenu2x

 

网友移植的树莓派版本(其实树莓派也可以直接用上面的版本):lualiliu/GMenuNext-on-raspberry-pi: GMenuNext is a fork of GMenu2X developed to Raspberry Pi (github.com)

编译:

在raspberry pi中安装各种libsdl依赖

make dist

编译后的文件在dist文件夹中。

映射到fb1(如TFT屏幕)

安装屏幕驱动(install screen driver)

将:gmenu2x.cpp(lines 367)

putenv((char*)"FRAMEBUFFER=/dev/fb0");

putenv((char*)"SDL_FBDEV=/dev/fb0");

修改为:

putenv((char*)"FRAMEBUFFER=/dev/fb1");

putenv((char*)"SDL_FBDEV=/dev/fb1");

 

 

3.commander:一个轻量级文件管理器,支持查看编辑文件,运行程序

 编译:

mkdir build
cd build
cmake ..
//注:在树莓派A+里编译会报AddressSanitizer相关的错,cmake的时候把这个东西屏蔽掉就行了 cmake .. -DCMAKE_BUILD_TYPE=Release -DUSE_SANITIZER=OFF make

依赖:

因为是基于SDL的,所以需要安装各种SDL库,例如:

sudo apt-get install libsdl2-dev

sudo apt-get install libsdl2-image-dev

运行:

程序的执行需要res文件夹里的东西,所以把commander拷贝到github项目的根目录,然后直接运行

 

 

4.Simple Terminal:一个轻量级终端

编译:

make

运行:

./st

 

 

5.Snes9x4D:SFC模拟器

编译:

make -f Makefile.linux

运行:

 ./snes9x4d game.sfc

 

 

5.fake-08:PICO-8 模拟器

注意,该项目依赖子仓库,要拉取全:git clone --recursive https://github.com/jtothebell/fake-08.git

依赖:

不确定需不需要安装,devkitPro

wget https://apt.devkitpro.org/install-devkitpro-pacman
chmod +x ./install-devkitpro-pacman
sudo ./install-devkitpro-pacman

编译:

make sdl (需要什么平台把sdl换成对应的平台)

运行:

./platform/SDL1_2/FAKE08

 

 

6.gpsp:GBA模拟器(未通过)

据说性能很高,但我没运行起来,注:这个模拟器貌似需要依赖GBA的BIOS ,要先下载这个,不然模拟不起来

树莓派版本:DPRCZ/gpsp: gpsp - Raspberry pi port (github.com),在docker的树莓派环境里可以成功编译,但是新版树莓派系统运行不起来,缺乏某些链接库,参考:GpSP - A ‘Beginners Guide’ to Compiling and Using - Raspberry Pi Forums

  cd gpsp-master/raspberrypi

  make

miyoo版本:Apaczer/gpsp: gpSP fork tuned for ARM Linux (port for MiyooCFW - PocketGo/V90/Q90 etc.) (github.com)

  cd miyoo

  make -f   //需要依赖miyoo sdk,确保/opt/下面有miyoo文件夹,目前只有司徒的sdk能正常编译成功。

  cp assets/gba_bios.bin ./  // 把bios复制到跟模拟器同一个目录

  ./gpsp   (在树莓派上运行黑屏)

 

 

7.Doom:毁灭战士

卡马克大神开源的游戏,原版代码太久远,用现在的gcc工具编译各种报错,github上有大佬已经修改了一个比较现代的版本:chocolate-doom/chocolate-doom: Chocolate Doom is a Doom source port that is minimalist and historically accurate. (github.com)

Linux可以直接安装:sudo apt install chocolate-doom

编译:

sudo apt-get install autotools-dev autoconf automake libtool

sudo ./autogen.sh   //会检查各种依赖,如果没报错,会生成一个叫config.status的文件

sudo make -j36

sudo make install

依赖:

SDL >= 2.0.14  (但是实际经过测试,自己编译的新版SDL 2.29.0无法通过编译,用ubuntu apt安装的2.0.20版本可以正常编译,应该是只支持2.0.x版本)

sudo apt-get install libsdl2-mixer-dev

sudo apt-get install libsdl2-net-dev

运行:

如果上面成功安装可以直接:chocolate-doom

不然可以到src目录下:

cd src

./chocolate-doom

注意:这游戏开源的是源代码,并不包含游戏资源(美术,关卡,音效等),所以直接运行是无法游戏的,需要游戏数据包 wad 文件。

解决方法,先在电脑上安装一下游戏sudo apt install chocolate-doom,然后把游戏资源提取出来,把电脑 /usr/share/games/doom/ 下面的wad文件复制到编译好的机器的相同目录下

 

 

8.SDL2

有时候对SDL版本有要求,比如上面的doom就要SDL2.0.14以上,而apt仓库能安装到的最新版还达不到这个要求,所以要手动编译

git clone https://github.com/libsdl-org/SDL.git

cd SDL

git switch release-2.24.x   (因为默认是SDL3,要手动切换要2.X的版本)

mkdir build

cd build

cmake ..

make -j36

sudo make install

如果都没报错,这可以通过:sdl2-config --version 查看当前版本:2.24.2

注意,编译好新版sdl并且安装后,sdl相关的依赖也要升级一波,例如libsdl2-mixer-dev、libsdl2-image-dev之类的,重新apt install下

 

 

9.eduke32

 不知道是啥游戏,看着挺像doom。

仓库1:Apaczer/eduke32: Duke Nukem 3D port for Miyoo - Bittboy / PocketGO / V90 ... (github.com) 

专为miyoo修改的版本,克隆仓库后直接 ./mkduke_miyoo.sh 便开始编译。

注:/opt/下面要放miyoo的sdk,目前经过测试,只有司徒的sdk能用,其他的编译失败,貌似是作者的代码写死了只能用uclibc。

仓库2:官网下载源码 https://dukeworld.com/eduke32/synthesis/latest/eduke32_src_20231206-10534-41c17613f.tar.xz

解压后进入,直接 make 即可。

注意:这游戏跟doom一样同样只是代码开源,美术资源关卡音效等游戏数据是要自己去获取的。一个简单的方式是直接从那个Miyoo版的release资源里提取出来:https://github.com/Apaczer/eduke32/releases/download/v1_0/eduke32-v1_0.zip

 

 

9.Quake:雷神之锤

todo

 

 

10.Picodrive:MD模拟器

Apaczer/picodrive: Fast MegaDrive/MegaCD/32X emulator (github.com)

git clone https://github.com/Apaczer/picodrive.git

git submodule update --init  // 有子模块依赖,更新子模块

./configure   // 配置,不指定参数默认配置为generic平台

make -j

运行:./PicoDrive

编译miyoo版本:

CROSS_COMPILE=arm-miyoo-linux-uclibcgnueabi- CFLAGS="-I/opt/miyoo/arm-miyoo-linux-uclibcgnueabi/sysroot/usr/include -I/opt/miyoo/arm-miyoo-linux-uclibcgnueabi/sysroot/usr/include/SDL" LDFLAGS="--sysroot /opt/miyoo/arm-miyoo-linux-uclibcgnueabi/sysroot" ./configure --platform=miyoo
如果配置正常,会提示
architecture arm
platform miyoo
sound drivers sdl
C compiler arm-miyoo-linux-uclibcgnueabi-gcc
C compiler flags -mcpu=arm926ej-s -marm -I/opt/miyoo/arm-miyoo-linux-uclibcgnueabi/sysroot/usr/include -I/opt/miyoo/arm-miyoo-linux-uclibcgnueabi/sysroot/usr/include/SDL -D__MIYOO__ -I/opt/miyoo/arm-miyoo-linux-uclibcgnueabi/sysroot/usr/bin/../../usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -Wno-unused-result
libraries -L/opt/miyoo/arm-miyoo-linux-uclibcgnueabi/sysroot/usr/bin/../../usr/lib -lSDL -lpthread -lpng -lm -lz -ldl
linker flags --sysroot /opt/miyoo/arm-miyoo-linux-uclibcgnueabi/sysroot
libavcodec (mp3) no

然后直接make即可

注:直接在wsl里编译不知为何总是配置错误,目前测试通过的有miyoocfw/toolchain-shared-uclibc这个docker镜像

sudo docker run -it --rm -v "$(pwd)":/root -w /root miyoocfw/toolchain-shared-uclibc(直接加参数好像不行,先进容器,在手动执行上面的命令)

 

 

11.gambatte-dms:GB模拟器

miyoo版本:bardeci/gambatte-dms: Gambatte-DMS is a GB/GBC emulator for handheld devices, using a modified Gambatte core. (github.com)

这个库默认没有miyoo的makefile,手动修改下bittboy的

修改Makefile.bittboy里的sdk路径CHAINPREFIX=/opt/buildroot-bittboy/output/host为自己的sdk路径,并把编译器的名字也改下,然后make -f Makefile.bittboy

正常情况用miyoo sdk编译失败,-lmikmod -lmodplug库找不到,按照作者提供的解决方法:https://github.com/bardeci/gambatte-dms/issues/44#issuecomment-1846217867

  a.在Makefile.bittboy里和common.mk里把-lmikmod -lmodplug注释掉即可

  b.直接注释上面两个音频库可能会导致音频播放不正常(暂时没耳机没测试过),作者提供另一种方式,用他用的bittboy sdk编译:https://github.com/bittboy/buildroot (没尝试过)

libretro核心:libretro/gambatte-libretro: Hard fork of Gambatte to the libretro API. (github.com)

直接make就可以成功编译,但这只是一个核心,要有 RetroArch前端,否则运行不了

终端版本:gambaterm | Playing Game Boy Color Games in your Terminal (vxgmichel.github.io)

意外发现的一个版本,用python在控制台里直接运行gameboy

 

 

12.PocketSNES:另一个SFC模拟器(跟上面的Snes9x4D是同一个作者)

只在树莓派里编译成功,需要修改Makefile.pc里的CFLAGS +=  -O0 -g -m32,将-m32修改为-mbe32

然后make -f Makefile.pc

运行:./dist/pocketsnes.elf game.sfc

 

 

13.Peanut-GB :GB模拟器

一个非常小巧又快速的GameBoy模拟器,核心代码仅一个文件,可以在任何支持C99编译的地方编译,包括单片机上(只需要为核心代码提供诸如gb_rom_read,gb_cart_ram_read等硬件相关的函数即可)

缺点是目前仅能模拟GameBoy,作者说开始支持GBC了(CGB Support · Issue #50 · deltabeard/Peanut-GB (github.com)),并且部分游戏无法正常模拟。

树莓派Pico RP2040单片机上可以全速运行:deltabeard/RP2040-GB: Game Boy emulation on the Raspberry Pi RP2040 microcontroller. (github.com)

编译:

  如果只是编译核心程序,可以不用安装任何库,直接去example下面的benchmark编译make就行,这是一个性能测试demo,测试游戏能跑多少fps

  如果以sdl2为前端的话:

    sudo apt install libsdl2-dev

    cd Peanut-GB-master\examples\sdl2

    make

运行:

  ./peanut-benchmark rom.gb  (无显示的性能测试)

  ./peanut-sdl rom.gb       (sdl2前端)

posted @ 2023-11-22 16:23  JeasonBoy  阅读(478)  评论(0编辑  收藏  举报