离线环境下OpenEuler开发板手动部署g++/gcc编译环境的完整指南
1. 为什么需要离线部署g/gcc在工业嵌入式开发中我们经常会遇到这样的场景开发板运行的是OpenEuler这类开源操作系统但由于安全限制或现场环境限制设备完全无法连接外部网络。这时候如果需要使用g/gcc这样的基础编译工具链就会遇到大麻烦。我去年在一个智能摄像头项目上就吃过这个亏。客户使用的是海思SS928开发板系统是OpenEuler 22.03 LTS版本。当我们准备部署算法模型时突然发现板子上连最基本的g编译器都没有。更糟的是现场设备不允许联网常规的yum/dnf安装方式完全行不通。最后花了整整两天时间才搞定这个看似简单的编译环境搭建问题。离线部署g/gcc主要面临三个难点依赖库的完整性g不是独立运行的它依赖libstdc等基础库架构匹配问题开发板是aarch64架构必须找到对应版本的RPM包文件路径一致性解压后的文件必须放到系统正确的目录位置2. 准备工作获取正确的RPM包2.1 确定系统架构和版本在开始之前我们必须确认三个关键信息开发板的CPU架构通常是aarch64OpenEuler的具体版本号如22.03 LTS需要安装的gcc/g版本可以通过以下命令在开发板上查看uname -m # 查看架构 cat /etc/os-release # 查看系统版本2.2 下载RPM包对于OpenEuler 22.03 LTS aarch64版本我们需要从官方镜像站下载以下核心RPM包以gcc 10.3.1为例主编译器包gcc-10.3.1-13.oe2203.aarch64.rpmgcc-c-10.3.1-13.oe2203.aarch64.rpm基础依赖库libgcc-10.3.1-13.oe2203.aarch64.rpmlibstdc-10.3.1-13.oe2203.aarch64.rpmlibstdc-devel-10.3.1-13.oe2203.aarch64.rpm额外工具可选make-4.3-5.oe2203.aarch64.rpmbinutils-2.37-9.oe2203.aarch64.rpm注意不同版本的OpenEuler对应的软件包版本号可能不同务必确认版本匹配。3. 在主机系统上解压RPM包3.1 安装解压工具我们需要在一台能联网的Linux主机如Ubuntu上安装解压工具sudo apt update sudo apt install rpm2cpio cpio3.2 创建解压目录结构建议按照以下结构组织目录~/gcc_offline_install/ ├── rpms/ # 存放下载的原始rpm文件 ├── extracted/ # 解压后的文件 └── final/ # 最终打包目录3.3 逐层解压RPM包以解压gcc-c包为例mkdir -p ~/gcc_offline_install/extracted/gcc-c cd ~/gcc_offline_install/extracted/gcc-c rpm2cpio ../../rpms/gcc-c-10.3.1-13.oe2203.aarch64.rpm | cpio -idmv解压后会得到类似这样的目录结构./usr/ ├── bin/ │ └── g ├── lib64/ │ ├── libstdc.so.6 - libstdc.so.6.0.28 │ └── libstdc.so.6.0.28 └── include/ └── c/ └── 10.3.1/3.4 合并所有解压文件将所有解压后的usr目录合并mkdir -p ~/gcc_offline_install/final find ~/gcc_offline_install/extracted -name usr -exec cp -r {} ~/gcc_offline_install/final \;4. 打包和传输到开发板4.1 创建最终打包文件cd ~/gcc_offline_install/final tar -czvf gcc_rootfs_full.tar.gz usr/4.2 传输到开发板根据你的连接方式选择传输方法方法1使用scp传输scp gcc_rootfs_full.tar.gz root开发板IP:/root/方法2使用U盘拷贝# 在主机上 cp gcc_rootfs_full.tar.gz /media/U盘/ # 在开发板上 cp /media/U盘/gcc_rootfs_full.tar.gz /root/5. 在开发板上部署5.1 解压到系统目录cd /root tar -xzvf gcc_rootfs_full.tar.gz -C /这个命令会将所有文件解压到系统的正确位置可执行文件放到/usr/bin/库文件放到/usr/lib64/头文件放到/usr/include/5.2 更新动态链接库缓存ldconfig6. 验证安装结果6.1 基础检查which g g --version应该能看到类似这样的输出g (GCC) 10.3.1 20210422 (OpenEuler 10.3.1-13.oe2203)6.2 完整测试创建一个简单的C程序cat EOF test.cpp #include iostream #include vector int main() { std::vectorint vec {1,2,3}; std::cout Hello from OpenEuler! std::endl; for(auto v : vec) { std::cout v ; } return 0; } EOF编译并运行g test.cpp -o test -stdc11 ./test预期输出Hello from OpenEuler! 1 2 37. 常见问题排查7.1 缺少依赖库如果运行时出现类似error while loading shared libraries的错误可能是缺少某些依赖库。解决方法回到主机系统使用ldd命令检查依赖关系下载缺少的库对应的RPM包重复解压和打包过程7.2 路径冲突如果系统已有旧版gcc可能会遇到路径冲突。建议先备份原有gcc相关文件或者使用update-alternatives管理多版本7.3 符号链接问题有时解压后符号链接会失效可以手动重建cd /usr/lib64 ln -sf libstdc.so.6.0.28 libstdc.so.68. 进阶技巧8.1 制作本地yum源如果经常需要离线安装软件可以考虑在开发板上创建本地yum源在主机上下载所有需要的RPM包使用createrepo命令创建仓库将整个仓库目录拷贝到开发板配置本地repo文件8.2 静态链接编译为避免运行时依赖问题可以考虑静态链接g test.cpp -o test -static-libstdc8.3 交叉编译环境如果主机是x86架构可以设置交叉编译环境sudo apt install gcc-aarch64-linux-gnu g-aarch64-linux-gnu aarch64-linux-gnu-g test.cpp -o test
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2514013.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!