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

交叉编译笔记

​交叉编译是指在一个平台上编译出可在另一个平台运行的代码,例如在x86架构的Linux主机上编译适用于ARM架构开发板的程序,其核心难点在于编译环境的搭建。

编译器与工具链:本地编译(如x86平台)使用gcc/g++,交叉编译则需专用工具链(如arm-linux-g++),检查编译器版本命令:

g++ -v# 本地编译器
arm-linux-g++ -v# 交叉编译器

环境配置:路径管理的两种策略

1. 环境变量设置(推荐)

配置方法:

# 临时生效(当前终端)
exportPATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin/# 永久生效(写入~/.bashrc)
echo'export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin/'>> ~/.bashrc &&source ~/.bashrc

2. 绝对路径指定(灵活但繁琐)

无需设置环境变量,直接在编译命令中指定工具链完整路径,例如:

/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-g++ source.cpp -o output

三、实战演练:从FFmpeg到Qt的交叉编译

(一)通用编译流程

无论编译何种项目,Linux下的经典三步法始终适用:配置-编译-安装

(二)FFmpeg交叉编译实战

编译静态链接的ARM版FFmpeg,用于嵌入式媒体处理。

关键命令

./configure \
--prefix=host \# 安装路径(可自定义)
--enable-static \# 启用静态编译
--disable-shared \# 禁用动态库
--disable-doc \# 跳过文档生成
--cross-prefix=arm-linux- # 交叉编译器前缀(需与工具链匹配)
--arch=arm \# 目标架构
--target-os=linux        # 目标操作系统

执行流程

(三)Qt系列交叉编译指南
1. Qt4.8.5(嵌入式经典版本)

前置准备

修改mkspecs/qws/linux-arm-g++/qmake.conf配置文件:

QMAKE_CC=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc  # 指定交叉编译器
QMAKE_CXX=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-g++

编译命令

./configure \
-prefixhost\# 安装路径
-embedded arm \# 目标架构为ARM
-xplatform qws/linux-arm-g++ # 使用自定义配置
-release\# 发布版(非调试版)
-opensource\# 开源模式
-confirm-license \# 确认许可协议
-qt-sql-sqlite \# 启用SQLite数据库支持
-qt-gfx-linuxfb \# 使用Linux Framebuffer图形后端
# 省略大量非必要组件(如GUI特效、网络模块等),加快编译速度
-no-qt3support -no-phonon -no-svg -no-webkit ...

2. Qt5.9.8(跨平台兼容版)
核心差异
通过-xplatform参数指定架构,无需手动修改配置文件(配置文件需提前放置在mkspecs/目录)。

编译命令

./configure \
-prefixhost\
-xplatform linux-arm-g++ # 使用预定义的ARM配置
-recheck-all \# 重新检查配置
-optimized-qmake \# 优化qmake工具
-shared-static\# 混合编译(部分静态、部分动态)
-c++std c++1z \# 启用C++17标准
-no-dbus -no-openssl \# 禁用非必要服务与库
-linuxfb\# 目标图形系统为Linux Framebuffer

3. Qt6(CMake时代的新流程)

编译步骤:编译CMake-生成qmake-项目编译

四、避坑指南:常见问题与解决方案
1. 编译参数版本差异

现象

解决方案

2. 头文件缺失(以GL为例)
错误提示解决命令:

# Debian/Ubuntu系
sudoaptinstall libgl1-mesa-dev libglu1-mesa-dev# RHEL/CentOS系
sudo yum install mesa-libGL-devel mesa-libGLU-devel

3. 权限与编译效率优化

用户权限

解压提速:命令行操作优于图形界面,例如:

tar-zxvf qt-everywhere-opensource-src-5.9.8.tar.gz -C /opt/qt/ # 快速解压
rm-rf build/ # 命令行删除目录
http://www.xdnf.cn/news/972253.html

相关文章:

  • Docker部署Nginx-UI
  • 【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
  • 安装 PyCharm
  • Open3D 点云处理笔记
  • 城市照明深夜全亮太浪费?智能分时调光方案落地贵州某市
  • threadlocal的实现说明
  • python46
  • 端到端自动驾驶研究:通过强化学习与世界模型的协同作用向VLA范式演进
  • 曼昆《经济学原理》第九版 第十三章生产成本
  • 智能呼入系统助力酒店客服服务
  • 使用mpu6500/6050, PID,互补滤波实现一个简单的飞行自稳控制系统
  • 2025.6.10【ZR NOI模拟赛 T3】 过啥题 题解(Lucas 定理, 数位dp, 组合意义)
  • Java设计模式基础问答
  • 通过Wrangler CLI在worker中创建数据库和表
  • QFuture的使用方式
  • vue的created和mounted区别
  • 替代爬虫!亚马逊API采集商品详情实时数据开发教程
  • 《Java开发者进击之路:掌握Spring AI与DL4J,实现AI模型API集成》
  • MCU Keil中支持的变量类型和定义方法
  • 美业门店/个案疗愈门店管理系统具备「活动促销」功能有哪些优势?
  • 多面体编译的循环分块
  • iOS和桌面双端抓包实战经验总结:Sniffmaster与常见工具组合解析
  • 算法工程师工作面试常考问题汇总
  • HarmonyOS 应用开发学习记录 - 从Windows开发者视角看鸿蒙开发
  • RabbitMQ的使用--Spring AMQP(更新中)
  • 期末考试复习总结-《从简单的页面开始(上)》
  • CentOS7下的Nginx部署
  • 行业 |5G六年,互联网改变了什么?
  • WHAT - 组件库开发场景 - 完全无样式的 UI 组件库 Headless UI
  • 看板更新不及时该如何规范