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

如何把qt + opencv的库按需要拷贝到开发板

目录

核心问题:为什么我的 readelf 命令不工作?

详细对比:本机 readelf vs 交叉 readelf

✅ 正确的操作步骤

第 1 步:加载交叉编译环境

第 2 步:使用正确的 readelf 查看依赖

✅ 后续步骤:部署依赖库和程序

第 1 步:在交叉环境中定位依赖库 (.so 文件)

第 2 步:复制依赖库到开发板

第 3 步:部署并运行你的程序

总结


核心问题:为什么我的 readelf 命令不工作?

当你在交叉编译环境(例如,在 x86 电脑上为 ARM 开发板编译程序)下,尝试使用 readelf -d <你的程序> 来查看动态库依赖时,通常会遇到命令找不到或者报错的情况。

一句话概括原因:你必须使用交叉编译工具链配套提供的 readelf,而不是你电脑系统自带的。

  • 你电脑自带的 readelf:位于 /usr/bin/readelf,是为 x86 架构设计的,它不认识也不理解为 ARM 架构编译出来的程序文件(ELF 文件)。

  • 交叉工具链的 readelf:例如 arm-poky-linux-gnueabi-readelf,是专门为解析 ARM 架构的 ELF 文件而设计的。

详细对比:本机 readelf vs 交叉 readelf

特性 / 行为

本机 readelf

交叉工具链 arm-...-readelf

能否分析 ARM 程序

不能。会出现解析错误或直接报错,因为它不识别 ARM 格式。

可以。这是它的本职工作。

能否正确列出库依赖

不能。即使勉强运行,也无法正确解析 .so 依赖项(即 NEEDED 字段)。

可以。能准确地输出所有 NEEDED 的共享库。

是否存在于系统默认路径中

✅ 是,通常在 /usr/bin/ 目录下。

。它只存在于交叉编译工具链的目录中。

如何让它在终端中可用

直接使用。

必须先 source 环境设置脚本,将其路径添加到 PATH 环境变量中。

✅ 正确的操作步骤

即使你的程序(例如 Qt Creator 项目)已经成功编译,要检查其依赖,也必须先加载交叉编译环境。

第 1 步:加载交叉编译环境

打开一个新的终端窗口,执行 source 命令来加载环境配置文件。这个操作只需要在每个新的终端会话中执行一次。

# 请根据你自己的交叉编译链路径进行调整
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

发生了什么? 这个命令会修改当前终端的环境变量(尤其是 PATH),让系统能够找到 arm-poky-linux-gnueabi-gcc, arm-poky-linux-gnueabi-g++ 以及我们需要的 arm-poky-linux-gnueabi-readelf 等工具。

第 2 步:使用正确的 readelf 查看依赖

现在,你可以使用带特定前缀的 readelf 命令来分析你的 ARM 程序了。

# 将路径替换成你自己的可执行文件路径
arm-poky-linux-gnueabi-readelf -d ~/QtOpenCVTest/build-xxx/QtOpenCVTest | grep NEEDED
  • -d: 告诉 readelf 显示文件的动态段(dynamic section)。

  • | grep NEEDED: 从输出中过滤出包含 NEEDED 的行,这些行列出的就是程序运行时需要的共享库(.so 文件)。

重点:这个过程只是查看和分析,完全不需要重新编译你的项目。

✅ 后续步骤:部署依赖库和程序

通过 readelf 找到所有 NEEDED 的共享库之后,你的程序还不能直接在开发板上运行。因为这些 .so 文件此时只存在于你电脑的交叉编译环境中。你需要将这些依赖库连同你的程序一起部署到开发板上。

第 1 步:在交叉环境中定位依赖库 (.so 文件)

这些库文件通常位于交叉编译工具链的 sysroot 目录下的 /lib/usr/lib 中。sysroot 目录模拟了目标开发板的根文件系统。在你 source 了环境之后,可以通过环境变量 $SDKTARGETSYSROOT 直接访问它。

假设 readelf 显示需要一个库 libopencv_core.so.3.1,它在你电脑上的完整路径就是: $SDKTARGETSYSROOT/usr/lib/libopencv_core.so.3.1

第 2 步:复制依赖库到开发板

使用 scp 命令将所有找到的库文件从你电脑的 sysroot 目录拷贝到开发板的 /usr/lib 目录(或 /lib,取决于开发板系统)。

# 语法: scp <本地文件路径> <用户名>@<开发板IP>:<目标路径># 示例:拷贝一个库
scp $SDKTARGETSYSROOT/usr/lib/libopencv_core.so.3.1 root@192.168.1.10:/usr/lib/# 提示:你可以写一个脚本来自动读取 readelf 的输出并批量拷贝所有依赖库。
第 3 步:部署并运行你的程序

最后,将你编译好的可执行文件(例如 QtOpenCVTest)也拷贝到开发板上,例如拷贝到 /home/root 目录下。

scp ~/QtOpenCVTest/build-xxx/QtOpenCVTest root@192.168.1.10:/home/root/

现在,登录到开发板上,给程序添加执行权限并运行,它就能够找到你刚刚拷贝过去的库文件了。

# 在开发板的终端上执行
chmod +x /home/root/QtOpenCVTest
/home/root/QtOpenCVTest

总结

source 环境脚本,交叉工具链就不在你的 PATH 里,你就找不到 arm-...-readelf 命令。即使你尝试使用系统自带的 readelf,它也无法正确解析 ARM 架构的文件。找到依赖后,记得从 sysroot 目录将它们和你的程序一起部署到目标板上才能成功运行。

http://www.dtcms.com/a/445731.html

相关文章:

  • 网络安全设备 防火墙
  • Java学习之旅第二季-6:static关键字与this关键字
  • 高校健康驿站建设指引妖精直播
  • 违规通知功能修改说明
  • SOFA 架构--01--简介
  • 家具网站首页模板郑州销售网站
  • 如何将Spring Boot 2接口改造为MCP服务,供大模型调用!
  • DC-DC电源芯片解读:RK860
  • 从零开始的C++学习生活 3:类和对象(中)
  • 做网站的技术员包装设计概念
  • 【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)
  • k8s中Pod和Node的故事(1):过滤、打分、亲和性和拓扑分布
  • springboot自助甜品网站的设计与实现(代码+数据库+LW)
  • 网站建设业动态wordpress出现404
  • Vue3组件通信8大方式详解
  • LeetCode 刷题【100. 相同的树、101. 对称二叉树、102. 二叉树的层序遍历】
  • Go基础:Go语言应用的各种部署
  • 团购网站 seo电商网站怎么做
  • 无Dockerfile构建:云原生部署新姿势
  • 深入解析 IDM 插件开发挑战赛:技术要点与实践指南
  • 颜群JVM【03】类的初始化
  • 达梦数据库常用初始化参数与客户端工具使用
  • 命令行安装 MySQL 8.4.6
  • 数据库--数据库约束和表的设计
  • [Windows] 磁盘映像管理工具:WimTool v1.7.2025.1001
  • 公司自己做网站晋城企业网站建设价格
  • 【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
  • leetcode 79 单词搜索
  • 站长之家官网查询电子商务网站建设与实践上机指导
  • 二叉树实战笔记:结构、遍历、接口与 OJ 实战