关于嵌入式编译工具链与游戏移植的学习

一. 掌握Linux系统编译工具链的使用,环境依赖库配置等。

 1)在自己的虚拟机Ubuntu系统下,按照指南逐步编译 mininim源码(波斯王子重制开源版),思考主要步骤的作用和含义。最终完成游戏编译并运行之。 记录完整的操作步骤和故障解决办法。

 首先下载Ubuntu18ROS 链接: https://pan.baidu.com/s/1a7Ni22EIFLJC2BVEvOh4Bg?pwd=huzr 提取码: huzr 

  然后按照链接中的文档一步步地进行,通过网盘分享的文件:波斯王子游戏(重制开源版---Mininim)的Ubuntu平台编译.md
  链接: https://pan.baidu.com/s/18K4pSBi3xj8EBdBKEZzYrQ 提取码: n96r 
  最后可以将游戏编译并成功运行.

遇到的故障:在更新时遇到了 GPG 签名验证失败 的问题

解决办法 :

步骤 1:手动添加 ROS 的 GPG 密钥

执行以下命令下载并安装 ROS 官方 GPG 密钥:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys F42ED6FBAB17C654

如果提示 keyserver timed out 或连接失败,可以尝试其他密钥服务器,例如:

sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys F42ED6FBAB17C654
步骤 2:更新软件源索引

添加密钥后,重新执行更新命令:

sudo apt update

补充:检查 ROS 软件源配置

确保 /etc/apt/sources.list.d/ros-latest.list 文件中 ROS 源的地址正确(适用于 Ubuntu 18.04 Bionic):

deb http://packages.ros.org/ros/ubuntu bionic main

如果该文件不存在或内容错误,可以手动创建或修改:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

验证更新结果

执行 sudo apt update 后,若不再出现关于 EXPKEYSIG F42ED6FBAB17C654 的错误,说明 ROS 源已成功更新。如果仍有问题,可能需要进一步检查网络连接或尝试更换镜像源(例如使用国内 ROS 镜像源,如清华大学源)。

2)思考如何将编译好的mininim的二进制执行程序、游戏资源库data,已经执行程序所依赖的各种动态链接库,打包,复制到另外一台Ubuntu系统,直接运行? 记录操作过程。

1. 创建打包目录

首先,创建一个新目录用于存放所有需要打包的文件:

mkdir mininim_package

2. 复制 mininim 二进制文件和游戏资源库

将 mininim 二进制文件和游戏资源库(假设为 data 目录)复制到打包目录中:

cp /home/lyy/mininim/mininim mininim_package/
cp -r /home/lyy/mininim/data mininim_package/  # 若 data 目录存在

3. 复制依赖的动态链接库

依据 ldd 的输出,把所有依赖的动态链接库复制到打包目录:

#!/bin/bash

# 依赖库列表
DEPENDENCIES=(
    "/lib/x86_64-linux-gnu/libm.so.6"
    "/lib/x86_64-linux-gnu/libreadline.so.7"
    "/usr/local/lib/liballegro.so.5.2"
    "/usr/local/lib/liballegro_image.so.5.2"
    "/usr/local/lib/liballegro_audio.so.5.2"
    "/usr/local/lib/liballegro_acodec.so.5.2"
    "/usr/local/lib/liballegro_font.so.5.2"
    "/usr/local/lib/liballegro_primitives.so.5.2"
    "/usr/local/lib/liballegro_dialog.so.5.2"
    "/usr/local/lib/liballegro_color.so.5.2"
    "/usr/lib/liblua50.so.5.0"
    "/usr/lib/liblualib50.so.5.0"
    "/lib/x86_64-linux-gnu/libc.so.6"
    "/lib/x86_64-linux-gnu/libtinfo.so.5"
    "/lib/x86_64-linux-gnu/libpthread.so.0"
    "/usr/lib/x86_64-linux-gnu/libX11.so.6"
    "/usr/lib/x86_64-linux-gnu/libXcursor.so.1"
    "/usr/lib/x86_64-linux-gnu/libXi.so.6"
    "/usr/lib/x86_64-linux-gnu/libXinerama.so.1"
    "/usr/lib/x86_64-linux-gnu/libXrandr.so.2"
    "/usr/lib/x86_64-linux-gnu/libOpenGL.so.0"
    "/usr/lib/x86_64-linux-gnu/libGLX.so.0"
    "/usr/lib/x86_64-linux-gnu/libpng16.so.16"
    "/usr/lib/x86_64-linux-gnu/libjpeg.so.8"
    "/usr/lib/x86_64-linux-gnu/libwebp.so.6"
    "/usr/lib/x86_64-linux-gnu/libopenal.so.1"
    "/usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0"
    "/usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0"
    "/usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0"
    "/usr/lib/x86_64-linux-gnu/libpango-1.0.so.0"
    "/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0"
    "/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0"
    "/lib/x86_64-linux-gnu/libdl.so.2"
    "/usr/lib/x86_64-linux-gnu/libxcb.so.1"
    "/usr/lib/x86_64-linux-gnu/libXrender.so.1"
    "/usr/lib/x86_64-linux-gnu/libXfixes.so.3"
    "/usr/lib/x86_64-linux-gnu/libXext.so.6"
    "/usr/lib/x86_64-linux-gnu/libGLdispatch.so.0"
    "/lib/x86_64-linux-gnu/libz.so.1"
    "/usr/lib/x86_64-linux-gnu/libsndio.so.6.1"
    "/lib/x86_64-linux-gnu/librt.so.1"
    "/usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0"
    "/usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0"
    "/usr/lib/x86_64-linux-gnu/libatk-1.0.so.0"
    "/usr/lib/x86_64-linux-gnu/libcairo.so.2"
    "/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0"
    "/usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0"
    "/usr/lib/x86_64-linux-gnu/libfontconfig.so.1"
    "/usr/lib/x86_64-linux-gnu/libXcomposite.so.1"
    "/usr/lib/x86_64-linux-gnu/libXdamage.so.1"
    "/usr/lib/x86_64-linux-gnu/libthai.so.0"
    "/usr/lib/x86_64-linux-gnu/libffi.so.6"
    "/lib/x86_64-linux-gnu/libpcre.so.3"
    "/usr/lib/x86_64-linux-gnu/libXau.so.6"
    "/usr/lib/x86_64-linux-gnu/libXdmcp.so.6"
    "/usr/lib/x86_64-linux-gnu/libasound.so.2"
    "/lib/x86_64-linux-gnu/libbsd.so.0"
    "/usr/lib/x86_64-linux-gnu/libfreetype.so.6"
    "/usr/lib/x86_64-linux-gnu/libpixman-1.so.0"
    "/usr/lib/x86_64-linux-gnu/libxcb-shm.so.0"
    "/usr/lib/x86_64-linux-gnu/libxcb-render.so.0"
    "/lib/x86_64-linux-gnu/libselinux.so.1"
    "/lib/x86_64-linux-gnu/libresolv.so.2"
    "/lib/x86_64-linux-gnu/libmount.so.1"
    "/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0"
    "/lib/x86_64-linux-gnu/libexpat.so.1"
    "/usr/lib/x86_64-linux-gnu/libdatrie.so.1"
    "/lib/x86_64-linux-gnu/libblkid.so.1"
    "/usr/lib/x86_64-linux-gnu/libgraphite2.so.3"
    "/lib/x86_64-linux-gnu/libuuid.so.1"
)

# 目标目录
TARGET_DIR="mininim_package"

# 复制依赖库
for dep in "${DEPENDENCIES[@]}"; do
    cp "$dep" "$TARGET_DIR/"
done

把上述脚本保存为 copy_dependencies.sh,然后赋予执行权限并运行:

chmod +x copy_dependencies.sh
./copy_dependencies.sh

4. 创建启动脚本

为了确保程序能正确找到依赖的动态链接库,创建一个启动脚本 run_mininim.sh

#!/bin/bash

# 获取当前脚本所在的目录
SCRIPT_DIR=$(dirname "$(realpath "$0")")

# 设置 LD_LIBRARY_PATH 环境变量
export LD_LIBRARY_PATH=$SCRIPT_DIR:$LD_LIBRARY_PATH

# 运行程序
$SCRIPT_DIR/mininim

将上述脚本保存到 mininim_package 目录中,并赋予执行权限:

chmod +x mininim_package/run_mininim.sh

5. 打包目录

将 mininim_package 目录打包成一个压缩文件,方便复制到另一台 Ubuntu 系统:

tar -czvf mininim_package.tar.gz mininim_package

 

6. 在另一台 Ubuntu 系统上运行

把 mininim_package.tar.gz 复制到另一台 Ubuntu 系统,然后解压缩:

tar -xzvf mininim_package.tar.gz

进入 mininim_package 目录并运行启动脚本:

cd mininim_package
./run_mininim.sh

 

 

通过以上步骤,就可以把 mininim 二进制执行程序、游戏资源库以及所有依赖的动态链接库打包,并在另一台 Ubuntu 系统上直接运行。

二. 在树莓派3B上用python编程完成流水灯实验。

以下是在树莓派 3B 上使用 Python 控制 GPIO 实现流水灯效果的代码:

import RPi.GPIO as GPIO
import time

# 设置GPIO模式为BCM编号
GPIO.setmode(GPIO.BCM)

# 定义LED连接的GPIO引脚
led_pins = [17, 18, 27, 22, 23, 24]  # 根据实际连接修改

# 设置所有LED引脚为输出模式
for pin in led_pins:
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, GPIO.LOW)  # 初始状态为熄灭

try:
    print("按下 Ctrl+C 停止程序")
    while True:
        # 正向流水
        for pin in led_pins:
            GPIO.output(pin, GPIO.HIGH)  # 点亮LED
            time.sleep(0.1)  # 延时0.1秒
            GPIO.output(pin, GPIO.LOW)   # 熄灭LED
        
        # 反向流水
        for pin in reversed(led_pins):
            GPIO.output(pin, GPIO.HIGH)  # 点亮LED
            time.sleep(0.1)  # 延时0.1秒
            GPIO.output(pin, GPIO.LOW)   # 熄灭LED

except KeyboardInterrupt:
    print("程序已停止")
finally:
    # 清理GPIO设置
    GPIO.cleanup()

使用说明:

  1. 将 LED 的阳极 (长脚) 通过 220Ω 电阻连接到 GPIO 引脚 (17,18,27,22,23,24)
  2. 将 LED 的阴极 (短脚) 连接到树莓派的 GND
  3. 根据实际连接修改代码中的 led_pins 列表
  4. 使用 sudo 权限运行脚本:sudo python3 led_flow.py
  5. 按 Ctrl+C 终止程序

注意事项:

  • 确保已安装 RPi.GPIO 库 (树莓派系统默认安装)
  • 操作 GPIO 需使用 sudo 权限
  • 调整延时时间可改变流水速度
  • 结束程序后会自动清理 GPIO 设置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值