RK3588 平台下 librga 图形加速库实战:从源码编译到 Demo 部署全流程

📅 发布时间:2026/7/6 4:10:13 👁️ 浏览次数:
RK3588 平台下 librga 图形加速库实战:从源码编译到 Demo 部署全流程
1. 环境准备搭建你的“编译厨房”想在RK3588这块性能强劲的芯片上玩转图形加速第一步不是急着写代码而是要把“厨房”搭好。这个“厨房”就是我们的交叉编译环境。简单来说RK3588是ARM架构的板子我们通常是在x86架构的电脑比如你的Ubuntu虚拟机上写代码和编译这就需要一套特殊的“翻译工具”把我们在电脑上写的“菜谱”源码翻译成RK3588能直接执行的“菜肴”可执行文件。这套工具就是交叉编译工具链。我刚开始接触这块的时候也犯过迷糊直接用电脑自带的gcc去编译结果出来的程序在板子上根本跑不起来提示“格式不对”。所以这一步千万别省。1.1 虚拟机基础环境搭建我习惯在Ubuntu 20.04 LTS上做开发这个版本比较稳定社区支持也好。首先咱们得把一些基础的“锅碗瓢盆”装好。打开你的终端执行下面这条命令sudo apt update sudo apt install -y build-essential cmake git wget这条命令干了三件事sudo apt update是更新软件源列表确保能下载到最新的软件包build-essential是一组基础编译工具包含了gcc、g、make等这是编译任何C/C项目的基石cmake是项目管理工具librga项目就是用CMake来组织编译的所以它必不可少git是用来从网上下载源码的。这里有个小坑我踩过如果你的Ubuntu是新装的或者很久没更新sudo apt update可能会因为网络源的问题报错。这时候别慌可以尝试换个国内的软件源镜像比如阿里云或者清华的源速度会快很多也稳定。具体怎么换网上教程一大堆搜“Ubuntu 更换软件源”就行。1.2 获取交叉编译工具链工具链的选择有好几种比如Buildroot、Linaro、还有Rockchip官方SDK里自带的。对于librga我实测下来用Rockchip官方为RK3588定制的Buildroot工具链是最省心的兼容性最好。官方通常会在其开源仓库或SDK发布页面提供。你可以去Rockchip的Wiki或者其GitHub的rkbin仓库附近找找。假设我们找到了一个名为gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz的工具链版本号可能不同以实际为准。下载和解压的命令如下# 创建一个专门的目录来存放工具链保持环境整洁 mkdir -p ~/toolchains cd ~/toolchains # 下载工具链这里链接是示例请替换为实际有效的链接 wget https://some.rockchip.mirror/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz # 解压 tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz # 解压后工具链的路径通常是 ~/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu接下来我们需要把这个工具链的路径告诉系统这样CMake在编译的时候才能找到它。一个一劳永逸的方法是把它添加到系统的环境变量里。编辑你的~/.bashrc文件nano ~/.bashrc在文件末尾加上这一行请把路径替换成你自己的实际路径export PATH$PATH:$HOME/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin保存退出后执行source ~/.bashrc让配置立刻生效。然后你可以验证一下工具链是否安装成功aarch64-none-linux-gnu-gcc --version如果终端打印出了这个交叉编译器的版本信息比如“gcc version 10.3.1”那么恭喜你“厨房”的核心灶具已经就位了。这一步看似简单但路径设置不对是后续所有编译错误的万恶之源一定要仔细核对。2. 获取与配置librga源码“厨房”准备好了接下来该准备“食材”了也就是librga的源代码。Rockchip把librga的源码放在了GitHub上地址是https://github.com/airockchip/librga。我建议直接克隆主分支这样可以拿到最新的代码和修复。cd ~ git clone https://github.com/airockchip/librga.git cd librga进入项目目录后先别急着编译。librga的源码结构分为核心库core和示例samples。理论上我们应该先编译core层生成librga.so动态库然后再去编译samples。但是我在这里要分享一个我踩过的大坑也是很多新手会卡住的地方直接按照默认流程编译core层会遭遇极其复杂的依赖问题比如需要特定版本的DRMDirect Rendering Manager头文件、Mali内核驱动等这些依赖在纯虚拟机环境里很难配齐而且和RK3588板子上的实际系统版本强相关很容易导致编译出的库在板子上无法运行。所以我强烈推荐一个更稳妥、更快速的“捷径”使用预编译好的librga库文件。Rockchip在其另一个开源项目rknn_model_zoo中为了方便开发者已经提供了针对不同平台包括RK3588的Linux aarch64系统预编译好的librga.so和librga.a文件。这些库是官方用完整的SDK环境编译的兼容性绝对有保障。2.1 巧用预编译库替代源码编译我们来操作一下。首先去下载预编译库# 在librga源码目录同级或任意方便的位置操作 cd ~ # 克隆rknn_model_zoo仓库这个仓库比较大如果只想要库文件也可以去GitHub页面直接下载对应文件 git clone https://github.com/airockchip/rknn_model_zoo.git # 进入预编译库目录 cd rknn_model_zoo/3rdparty/librga/Linux/aarch64/在这个目录下你应该能看到librga.so和librga.a这两个文件。我们把它们拷贝到我们自己的librga项目目录中一个专门的地方方便管理# 回到librga源码目录 cd ~/librga # 创建一个目录用来存放我们自己的构建输出和第三方库 mkdir -p build_output # 拷贝预编译库 cp ~/rknn_model_zoo/3rdparty/librga/Linux/aarch64/librga.* ./build_output/现在我们有了现成的库文件接下来就需要告诉CMake“别费劲去编译core了直接用我给你的这个库吧”。这个配置过程是关键。2.2 修改CMake配置指向预编译库librga的示例代码编译脚本是samples/cmake-linux.sh而真正的编译规则定义在samples/CMakeLists.txt里。我们需要修改这两处。首先打开samples/cmake-linux.sh。这个脚本里原本可能设置了RGA_PATH和CORE_PATH去寻找源码编译的库。我们需要注释掉或修改这些行转而指向我们存放预编译库的build_output目录。但更直接的方法是我们通过修改CMakeLists.txt来全局设置。打开samples/CMakeLists.txt在文件比较靠前的位置比如在project()命令之后添加以下两行# 添加库文件的搜索路径 link_directories(/home/你的用户名/librga/build_output) # 添加头文件搜索路径指向源码中的include目录这是必需的 include_directories(../include)第一行link_directories至关重要它告诉链接器linker去我们指定的路径寻找librga.so或librga.a。请务必将/home/你的用户名/librga/build_output替换成你电脑上的绝对路径。使用相对路径有时在CMake复杂构建中会出问题绝对路径最保险。第二行include_directories是让编译器能找到librga的函数声明头文件这些头文件在源码的../include目录下是必需的。修改完后保存。这样一来编译samples时CMake就会自动链接我们准备好的预编译库完美绕过了core层的编译难题。这个方法我用了很多次在RK3566、RK3568、RK3588多个平台上都验证过非常稳定。3. 编译示例程序配置搞定编译就是水到渠成的事情了。librga的示例非常丰富有简单的图像拷贝copy、格式转换cvtcolor、缩放resize、旋转rotate等这些都是图形处理中最基础也最常用的操作非常适合用来学习和测试。3.1 执行编译脚本编译过程很简单就一条命令cd ~/librga/samples ./cmake-linux.sh这个脚本会自动调用CMake生成Makefile然后执行make和make install。如果一切顺利你会在终端看到一大堆编译信息最后没有报错并提示安装完成。编译好的Demo程序会被安装到samples/build/build_linux/install/bin/目录下。你可以进去看看ls -la ./build/build_linux/install/bin/你应该能看到像rga_copy_demo,rga_im2d_demo,rga_resize_demo这样的可执行文件。每个文件都不大因为它们动态链接了librga.so。3.2 排查常见编译错误当然实战中很少有一次就成功的。我总结几个常见的错误和解决办法找不到交叉编译工具链错误信息通常包含“Could NOT find C compiler”或“The C compiler ... is not able to compile a simple test program”。这百分百是工具链路径没设对。请回头仔细检查~/.bashrc中的PATH设置并确认source过。也可以在编译时通过给cmake-linux.sh传递参数来指定工具链但修改环境变量是根治方法。找不到librga库链接阶段报错如“cannot find -lrga”。这说明link_directories没生效。首先确认你修改的是samples/CMakeLists.txt而不是别的。其次确认你添加的路径是绝对路径并且路径中的librga.so和librga.a确实存在。你可以手动cat一下那个路径看看。头文件找不到编译早期报错如“fatal error: rga.h: No such file or directory”。这说明include_directories(../include)没生效或路径不对。检查这个路径是否正确地指向了源码中的include文件夹。如果遇到其他奇奇怪怪的错误可以先尝试rm -rf samples/build彻底清理一下构建目录然后重新执行./cmake-linux.sh。CMake的缓存有时会带来一些诡异的问题。4. 部署到RK3588板端运行编译成功生成了ARM架构的可执行文件接下来就是把这些“菜肴”端到RK3588这块“餐桌”上品尝了。部署的方式有很多可以通过网络scp/sftp、U盘或者直接编译进文件系统镜像。这里我们用最常用的网络传输方式。4.1 传输文件到开发板首先确保你的开发板和电脑在同一个局域网内。假设开发板的IP地址是192.168.1.100用户名是root实际请替换为你板子的信息。我们使用scp命令来传输整个bin目录下的Demo程序以及它们所依赖的librga.so库。# 从电脑传输Demo程序到开发板的 /userdata 目录这个目录通常可读写 scp -r ~/librga/samples/build/build_linux/install/bin/* root192.168.1.100:/userdata/ # 传输预编译的动态库文件到开发板的 /usr/lib 目录系统库目录 scp ~/librga/build_output/librga.so root192.168.1.100:/usr/lib/注意将动态库拷贝到/usr/lib需要root权限并且这是一个系统目录操作要小心。也可以选择拷贝到/userdata然后通过设置环境变量LD_LIBRARY_PATH来指定库的搜索路径这样更安全。例如在开发板上执行export LD_LIBRARY_PATH/userdata:$LD_LIBRARY_PATH4.2 在板端运行与验证通过SSH登录到你的RK3588开发板ssh root192.168.1.100然后进入你存放Demo的目录例如/userdata。我们先运行一个最简单的Demo来测试cd /userdata ./rga_copy_demo这个Demo的功能是把一张内置的测试图片在内存中复制一份。如果运行成功你会在终端看到类似 “RGA copy running success!” 的输出。看到“success”这个词心里就踏实了一大半。为了更直观地感受RGA的性能我们可以运行一个缩放Demo它通常会打印出处理一张图片所花的时间./rga_resize_demo输出里会包含时间信息比如“resize time: 12.345 ms”。这个时间非常短这正是硬件加速的魅力所在——把CPU从繁重的像素搬运和计算中解放出来。你可以尝试修改Demo源码里的图片尺寸看看时间如何变化感受一下RGA的速度。4.3 进阶测试与集成思路跑通基础Demo只是第一步。librga真正的威力在于集成到你自己的视觉应用中。你可以仔细阅读samples目录下的源代码比如rga_im2d_demo.c它展示了如何使用更灵活的im2dAPI 接口来完成一系列复杂的图像处理流水线pipeline。在实际项目中我通常这样用通过V4L2或Camera Hal获取到摄像头的一帧图像通常是NV12或YUYV格式这块内存的地址fd或ptr可以直接传递给RGA。然后调用RGA的函数进行裁剪、缩放、格式转换比如转成RGB888给神经网络模型输入处理完的内存可以直接送显示HDMI或送给NPURKNN做推理。整个过程数据在内存里流动几乎不需要CPU参与格式转换和缩放这种“体力活”效率极高。这里再提一个部署时可能遇到的坑库版本冲突。如果你的RK3588板载系统里已经预装了一个旧版本的librga.so而你拷贝过去的是新版本可能会因为符号symbol不兼容导致程序崩溃。解决方法有两种一是用你编译的新库替换掉系统的旧库有风险二是更推荐的方法将你的Demo程序和它依赖的特定版本librga.so放在同一个私有目录并通过LD_LIBRARY_PATH指向这个目录实现库的隔离。整个过程从环境搭建到Demo跑通虽然步骤不少但每一步都有明确的目标。最关键的就是理解交叉编译的概念以及学会巧妙利用官方提供的预编译库来绕过复杂的底层依赖。当你第一次在RK3588上看到“running success”时那种成就感就是驱动我们开发者继续折腾下去的动力。硬件加速的世界大门已经打开接下来如何利用RGA去优化你的图像处理流水线做出更流畅、更省电的应用就是更有趣的挑战了。