当前位置: 首页 > article >正文

从零到一:在Ubuntu上为树莓派搭建交叉编译环境与wiringPi实战

1. 为什么需要交叉编译环境第一次接触树莓派开发的朋友可能会疑惑为什么不能直接在树莓派上写代码编译呢我刚开始也有同样的疑问直到实际开发时才发现问题。树莓派的ARM处理器性能有限编译一个稍复杂的程序可能要等好几分钟。有次我写了个带图形界面的程序在树莓派上编译足足花了8分钟而同样的代码在Ubuntu笔记本上交叉编译只用了15秒。交叉编译的本质就像翻译工作。想象你要把中文书翻译成英文有两种选择要么找个会说中英文的英国人本地编译要么在中国找专业翻译团队交叉编译。显然后者效率更高因为翻译团队有更强大的硬件资源高性能电脑、专业软件等。同理用x86架构的Ubuntu电脑为ARM架构的树莓派交叉编译能充分利用PC的性能优势。实际开发中还会遇到更棘手的情况。比如开发树莓派上的Linux驱动时目标平台连操作系统都还没装好这时候交叉编译就成了唯一选择。我去年参与的一个物联网项目就是这样需要先交叉编译出树莓派的bootloader和内核镜像才能进行后续开发。2. 搭建交叉编译工具链2.1 获取官方工具链树莓派基金会提供了官方工具链这是最可靠的选择。我对比过第三方工具链发现官方版本对树莓派硬件的支持最完善。获取方法很简单git clone https://github.com/raspberrypi/tools如果GitHub访问慢可以试试官方镜像。下载完成后建议将工具链放在/opt目录下sudo mv tools /opt/rpi-tools记得检查工具链版本是否匹配你的树莓派型号。我的树莓派4B使用的是arm-bcm2708目录下的gcc-linaro-arm-linux-gnueabihf-raspbian-x64工具链。有个小技巧用file命令查看树莓派上/usr/bin下的任意可执行文件就能确认架构file /usr/bin/ls2.2 配置环境变量临时设置PATH虽然简单但每次重启都要重新配置。我推荐修改.bashrc实现永久生效echo export PATH$PATH:/opt/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin ~/.bashrc source ~/.bashrc验证是否配置成功arm-linux-gnueabihf-gcc --version如果看到类似gcc version 4.8.3 20140106的输出说明配置正确。这里有个坑要注意不同版本的工具链可能使用不同的前缀有的是arm-linux-gnueabihf-有的是arm-rpi-linux-gnueabihf-一定要确认清楚。3. 第一个交叉编译程序3.1 编写测试程序创建一个简单的LED闪烁程序blink.c#include stdio.h #include wiringPi.h int main(void) { wiringPiSetup(); pinMode(1, OUTPUT); while(1) { digitalWrite(1, HIGH); delay(500); digitalWrite(1, LOW); delay(500); } return 0; }交叉编译时要注意指定正确的库路径arm-linux-gnueabihf-gcc blink.c -o blink -I/usr/local/include -L/usr/local/lib -lwiringPi这个命令中-I指定头文件路径-L指定库文件路径-l链接具体库3.2 部署到树莓派我习惯用scp传输文件比U盘方便多了scp blink pi192.168.1.100:~/projects然后在树莓派上运行./blink如果遇到libwiringPi.so找不到的错误需要检查树莓派上的库路径是否包含该库。可以用ldd命令查看程序依赖ldd blink4. wiringPi库的安装与使用4.1 方法一源码编译安装这是最推荐的方式能确保版本匹配git clone https://github.com/WiringPi/WiringPi cd WiringPi ./build安装后检查版本gpio -v我在树莓派4B上遇到过兼容性问题解决方法是使用特定分支git checkout legacy ./build4.2 方法二直接复制库文件当源码编译失败时可以从另一台树莓派复制scp pi192.168.1.100:/usr/lib/libwiringPi.so.2.50 . ln -s libwiringPi.so.2.50 libwiringPi.so然后编译时需要指定库路径arm-linux-gnueabihf-gcc -L. -lwiringPi ...4.3 常见问题解决遇到undefined reference错误时可能是链接顺序问题。GCC的链接器是从右往左解析依赖的正确的顺序应该是arm-linux-gnueabihf-gcc blink.c -lwiringPi -lpthread -lm -lcrypt -lrt如果使用CMake需要在CMakeLists.txt中设置交叉编译参数set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g)5. 进阶技巧与优化5.1 使用ccache加速编译安装ccache后修改.bashrcexport CCACHE_PREFIXarm-linux-gnueabihf- export PATH/usr/lib/ccache:$PATH这样重复编译时能显著提升速度。我的一个项目编译时间从45秒缩短到了8秒。5.2 静态链接简化部署对于简单程序可以静态链接避免库依赖问题arm-linux-gnueabihf-gcc -static blink.c -lwiringPi但要注意这会使可执行文件变大我的测试程序从15KB增大到了650KB。5.3 交叉调试技巧在Ubuntu上安装gdbserversudo apt install gdb-multiarch在树莓派上运行gdbserver :1234 ./blink在Ubuntu上连接调试gdb-multiarch ./blink target remote 192.168.1.100:12346. 实际项目经验分享去年开发智能家居控制器时我建立了完整的交叉编译工作流。项目结构如下project/ ├── build/ ├── CMakeLists.txt ├── src/ └── toolchain.cmaketoolchain.cmake内容set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g) set(CMAKE_FIND_ROOT_PATH /opt/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)这样就能用CLion等IDE直接开发树莓派项目了。部署时我写了个简单的脚本#!/bin/bash scp build/project pi$1:~/projects ssh pi$1 cd ~/projects ./project使用时只需运行./deploy.sh 192.168.1.100就能完成编译部署全过程。

相关文章:

从零到一:在Ubuntu上为树莓派搭建交叉编译环境与wiringPi实战

1. 为什么需要交叉编译环境 第一次接触树莓派开发的朋友可能会疑惑:为什么不能直接在树莓派上写代码编译呢?我刚开始也有同样的疑问,直到实际开发时才发现问题。树莓派的ARM处理器性能有限,编译一个稍复杂的程序可能要等好几分钟。…...

Qianfan-OCR部署教程:模型路径/root/ai-models/baidu-qianfan/Qianfan-OCR配置规范

Qianfan-OCR部署教程:模型路径/root/ai-models/baidu-qianfan/Qianfan-OCR配置规范 1. 项目概述 百度千帆推出的Qianfan-OCR是一款开源的4B参数端到端文档智能多模态模型,基于Qwen3-4B语言模型构建。这个多模态视觉语言模型(VLM)采用Apache 2.0协议&am…...

如何在可视化界面调整列的顺序_Move Column移动字段到指定位置操作

列顺序必须从SQL查询或数据建模层控制,界面拖拽仅影响临时视图显示。Tableau、Power BI、Superset的拖拽操作不改变底层字段顺序,导出或刷新后复位;ORDER BY只影响行序,与列序无关。拖拽列顺序在主流 BI 工具里根本不可靠多数可视…...

Maxtang SXC-ALN30无风扇迷你主机工业应用解析

1. Maxtang SXC-ALN30无风扇迷你主机深度解析在工业自动化和嵌入式应用领域,一台兼具高性能与丰富接口的无风扇迷你主机往往能成为项目成功的关键。Maxtang SXC-ALN30就是这样一款专为严苛环境设计的设备,它搭载了Intel Alder Lake-N系列处理器&#xff…...

SVG核心属性解析与动态交互实现

1. SVG核心属性深度解析 SVG作为矢量图形的标准格式,其强大之处在于丰富的属性系统。这些属性不仅能定义图形外观,更能通过动态修改实现复杂的交互效果。我们先从几个关键属性入手,看看它们如何成为动态交互的基石。 viewBox属性堪称SVG的&qu…...

从吉尔伯特单元到混频器:一个CMOS差动放大器的‘跨界’实战应用解析

从吉尔伯特单元到混频器:一个CMOS差动放大器的‘跨界’实战应用解析 在模拟集成电路设计的浩瀚海洋中,差动放大器犹如一艘稳健的航船,承载着信号处理的基础重任。而当这艘航船驶入射频通信的湍流海域时,它的形态开始发生奇妙的变化…...

系统容灾方案

系统容灾方案:保障业务连续性的关键 在数字化时代,企业的核心业务系统一旦发生故障,可能导致巨大的经济损失和声誉风险。系统容灾方案正是为了解决这一问题而生,它通过技术手段确保业务在灾难发生时仍能持续运行。无论是自然灾害…...

Janus-Pro模型注意力机制与SSD缓存优化解析

1. Janus-Pro模型中的注意力机制解析注意力机制作为现代深度学习架构的核心组件,其本质是一种动态权重分配系统。在Janus-Pro模型中,这一机制被专门优化用于处理图像生成任务中的长序列数据。理解其工作原理需要从三个层面切入:1.1 基础注意力…...

nli-MiniLM2-L6-H768案例展示:英文新闻事件因果链自动构建过程

nli-MiniLM2-L6-H768案例展示:英文新闻事件因果链自动构建过程 1. 模型简介 nli-MiniLM2-L6-H768是一个专为自然语言推理(NLI)与零样本分类设计的轻量级交叉编码器(Cross-Encoder)模型。它在保持接近BERT-base精度的同时,通过6层768维的结构设计实现了…...

RTX 30系显卡救星:保姆级教程搞定Windows下TensorFlow 2.4.0 GPU环境(含Pillow版本避坑)

RTX 30系显卡救星:保姆级教程搞定Windows下TensorFlow 2.4.0 GPU环境(含Pillow版本避坑) 最近在帮同事配置TensorFlow 2.4.0 GPU环境时,发现30系显卡用户遇到的坑比想象中多得多。特别是那些看似莫名其妙的报错,比如&q…...

从新手到高手:我踩过的PyTorch布尔转浮点那些坑,以及一个被低估的`.to()`方法

从新手到高手:PyTorch布尔转浮点的深度探索与.to()方法实战指南 第一次接触PyTorch时,我被它的灵活性和强大功能所吸引,但同时也被一些看似简单的问题困扰——比如如何优雅地将布尔张量转换为浮点张量。这个问题看似微不足道,却折…...

别再为点云空洞发愁了!PCL实战:三种主流修复方法(几何/检索/深度学习)保姆级解读

三维点云空洞修复实战指南:几何、检索与深度学习的全景解决方案 当你在处理建筑BIM扫描数据时,突然发现关键结构部位存在大面积点云缺失;或者在进行文物数字化建模时,珍贵器物表面的精细纹理因传感器盲区而断裂——这种时刻&#…...

Docker边缘容器启动失败率骤降87%的秘密(边缘网络策略与cgroup v2深度调优实录)

第一章:Docker边缘容器启动失败率骤降87%的实践启示在某工业物联网边缘计算平台的实际部署中,Docker容器在资源受限的ARM64边缘节点上启动失败率曾高达32%,主要表现为OCI runtime create failed、no space left on device及context deadline …...

从Docker Hub拉取的镜像真的可信吗?——基于eBPF实时签名验证的运行时防护方案(附可复现PoC代码)

第一章:从Docker Hub拉取的镜像真的可信吗?——基于eBPF实时签名验证的运行时防护方案(附可复现PoC代码)Docker Hub 上超过 1,000 万镜像中,仅约 7% 来自官方仓库,其余均由社区用户上传。缺乏强制签名机制意…...

Blazor组件库选型生死局:MudBlazor vs AntDesign Blazor vs 新晋冠军FluentUI Blazor(2026 Q1真实项目压测对比)

第一章:Blazor组件库选型生死局:MudBlazor vs AntDesign Blazor vs 新晋冠军FluentUI Blazor(2026 Q1真实项目压测对比)在2026年Q1交付的中大型企业级Blazor WebAssembly应用中,我们对三款主流组件库进行了全链路压测—…...

【C# .NET 11 AI推理加速实战白皮书】:微软内部未公开的5大GPU内存优化技巧首次披露

第一章:【C# .NET 11 AI推理加速实战白皮书】核心价值与技术背景.NET 11 标志着微软在统一运行时、跨平台性能与AI原生支持上的重大跃进。其深度集成的原生向量化指令(如 AVX-512 / ARM SVE2)、零拷贝内存共享机制,以及对 ONNX Ru…...

Docker守护进程配置、cgroup资源隔离与seccomp默认策略——金融生产环境必须禁用的5个默认选项,你关了吗?

第一章:Docker金融安全配置的合规性基线与风险全景在金融行业,容器化部署必须满足《GB/T 35273—2020 信息安全技术 个人信息安全规范》《JR/T 0197—2020 金融行业网络安全等级保护实施指引》及PCI DSS v4.0等强监管要求。Docker本身默认配置存在多项高…...

AI宏观因子模型:强美元与高利率预期共振下,黄金价格出现2%回撤机制解析

摘要:本文通过构建多因子宏观定价模型,结合利率路径预测、美元指数动态权重调整以及能源通胀传导机制,分析在强美元与高利率预期共振背景下,黄金价格阶段性回调的驱动逻辑与市场行为特征。一、价格动量模型触发回撤,黄…...

保姆级教程:从下载到出图,用VINS-Fusion和EVO完整评测TUM VI数据集(附避坑配置)

保姆级教程:从下载到出图,用VINS-Fusion和EVO完整评测TUM VI数据集(附避坑配置) 视觉惯性SLAM技术正在机器人导航、增强现实等领域快速普及,而TUM VI数据集作为视觉惯性里程计研究的黄金标准,其丰富的室内外…...

Verilog参数化设计:从模块定义到灵活例化的实战指南

1. Verilog参数化设计基础 参数化设计是Verilog HDL中提升代码复用性的核心技巧。想象你正在设计一个智能家居系统中的多路PWM控制器,每路都需要独立的频率和占空比参数。如果为每个通道单独编写模块,代码会变得冗长且难以维护。这就是参数化设计大显身手…...

Redis怎样追踪系统执行的缓慢操作

slowlog 是 Redis 唯一实时捕获慢命令的机制,为内存环形缓冲区,仅记录执行耗时超阈值的命令,不包含网络延迟与排队时间;默认阈值10ms,建议调至5ms,slowlog-max-len建议设为1024,并需CONFIG REWR…...

2026年网站制作流程全解析:从零开始的完整步骤指南

网站制作涉及需求规划、设计开发、系统搭建、测试上线等多个环节,流程复杂且环环相扣。本文基于2026年建站实践,整理了从需求沟通到后期维护的完整步骤,帮助企业高效完成网站建设,确保上线后的稳定性与收录效果。第一步&#xff1…...

【深度解析】Cloud Context:给 AI 编码助手装上“代码库 RAG”,彻底解决大型仓库上下文获取难题

摘要 Cloud Context 的核心价值不在“更强模型”,而在“更高效上下文获取”。本文从 RAG、混合检索、AST 分块、增量索引等角度,系统解析它为何能显著提升 AI Coding Agent 在大型代码仓库中的可用性,并给出一套可落地的 Python 实战示例&…...

APP豆包验证码辅助工具UI设计

这个功能是我自己用的:因为如果上架可能会被告的-----我丝毫不怀疑他会流行如果上架的话但是那些做自动化的人,可能很多人也能自己做,所以结果其实也不确定。反正也是自己用...

如何快速配置Betaflight编译环境:终极GCC工具链选择指南

如何快速配置Betaflight编译环境:终极GCC工具链选择指南 【免费下载链接】betaflight Open Source Flight Controller Firmware 项目地址: https://gitcode.com/gh_mirrors/be/betaflight Betaflight作为开源飞行控制器固件的核心,其编译环境的正…...

Visual Syslog Server:5分钟打造Windows平台专业级日志集中管理系统

Visual Syslog Server:5分钟打造Windows平台专业级日志集中管理系统 【免费下载链接】visualsyslog Syslog Server for Windows with a graphical user interface 项目地址: https://gitcode.com/gh_mirrors/vi/visualsyslog Visual Syslog Server 是一款专为…...

别再乱接线了!ESP32-S3固件烧录保姆级硬件自查清单(含常见失败原因)

ESP32-S3固件烧录失败?这份硬件自查清单能救你 刚拿到ESP32-S3开发板时,那种跃跃欲试的心情我至今记得。但当我按照教程接好线,点击烧录按钮后,屏幕上却跳出"等待上电同步"的提示,那一刻的挫败感同样记忆犹新…...

如何永久保存你的数字记忆:WeChatMsg个人数据管理终极指南

如何永久保存你的数字记忆:WeChatMsg个人数据管理终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

专业级Rust架构:RPFM全面战争模组开发的革命性解决方案

专业级Rust架构:RPFM全面战争模组开发的革命性解决方案 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt5 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://gi…...

一次完整的渗透测试实战:从踩点到提权全记录

一次完整的渗透测试实战:从踩点到提权全记录 渗透测试就是利用我们所掌握的渗透知识,对网站进行一步一步的渗透,发现其中存在的漏洞和隐藏的风险,然后撰写一篇测试报告,提供给我们的客户。客户根据我们撰写的测试报告&…...