日常工作记录--------Ubuntu20编译高通代码报错

日常工作记录--------Ubuntu20编译高通代码报错

1.m4 subprocess failed: No such file or directory
sudo apt-get install m4
2.libtinfo.so.5: cannot open shared object file: No such file or directory
sudo apt-get install libtinfo5
3.FAILED: build out/target/product/VG2/abl.elf

在 bootable/bootloader/edk2 目录下执行:

rm -rf Conf/BuildEnv.sh
unset EDK_TOOLS_PATH
./edksetup.sh BaseTools
4.fatal error: ‘uuid/uuid.h’ file not found
sudo apt-get install uuid-dev
5.“g_pipelines.h” not found
sudo apt-get install libxml-simple-perl

因为电脑是刚重装的,所以很多环境都没有,就看编译报错,缺啥补啥,最后代码编译成功

<think>嗯,用户遇到了一个在开发板上运行adb传输的a.out文件时报错的问题,错误信息是"cannot execute binary file: Exec format error"。这个错误很典型,通常和可执行文件的格式与运行环境不匹配有关。 用户可能是在做嵌入式开发或者交叉编译相关的工作,把PC上编译的程序传到ARM开发板运行。从错误信息看,最核心的问题应该是架构不匹配——用户很可能在x86电脑上编译了程序,然后直接传到ARM架构的开发板执行。 参考之前提供的引用资料,有几个关键点需要确认: 1. 编译环境是否匹配:引用[1]提到32位和64位系统不匹配会导致这个问题,同样道理也适用于x86和ARM架构差异 2. 文件格式检查:引用[3]特别指出WSL无法运行32位程序的情况,说明二进制格式检查很重要 3. 交叉编译的必要性:嵌入式开发中必须使用交叉编译工具链,这点在引用[2]的ARM架构案例中提到过 用户可能忽略了交叉编译这个关键步骤。ta可能直接用gcc编译了程序,但PC的gcc默认生成x86指令集,而开发板是ARM架构的。需要让用户明白:CPU就像说不同语言的人,x86程序在ARM板上就像让英国人听中文指令,完全无法执行。 解决方案应该分三步走: 先教用户检查开发板架构,用uname命令确认是armv7l还是aarch64 再说明如何获取交叉编译工具链,不同架构要选不同的编译器前缀 最后给出具体的编译命令示例,比如arm-linux-gnueabihf-gcc 还要提醒用户注意执行权限问题,虽然引用[1]提到chmod +x的解决方案,但在架构不匹配时改权限是没用的。可以补充说明如果确认架构匹配后仍然报错,才需要检查执行权限。 考虑到用户可能不熟悉嵌入式开发流程,解释时要避免太多专业术语。用"翻译官"比喻交叉编译器可能比较形象。最后留三个实用问题帮助用户深入理解:如何检查文件格式、处理动态链接库依赖、以及嵌入式开发中常见的其他运行错误。</think>好的,这个问题在嵌入式开发中很常见,根本原因是**可执行文件(`a.out`)的编译架构与你的开发板(目标平台)的CPU架构不匹配**。 简单来说,你在**宿主机**(通常是x86/x86_64架构的PC)上编译的程序,未经特殊处理(交叉编译),无法直接在**目标机**(通常是ARM、MIPS等架构的开发板)上运行。开发板的CPU无法理解PC编译出来的机器指令。 以下是详细原因分析和解决方案: **原因分析:** 1. **架构不匹配 (Architecture Mismatch):** 这是最常见的原因。 * **宿主机 (PC):** 通常使用 Intel/AMD 的 x86 或 x86_64 (64位) CPU。 * **开发板 (目标机):** 通常使用 ARM (如 armv7l, aarch64)、MIPS、RISC-V 等嵌入式架构的 CPU。 * **问题:** 在PC上用默认的`gcc`或`clang`编译生成的`a.out`包含的是x86/x86_64指令集。当把这个文件通过`adb push`传输到ARM开发板上执行时,ARM CPU无法识别x86指令,因此报错 `cannot execute binary file: Exec format error`。这就像让一个只懂英语的人去读中文写的操作手册一样。 2. **位宽不匹配 (Bit Width Mismatch):** 即使架构相同(例如都是ARM),32位(armv7l)和64位(aarch64)也可能不兼容。 * 在64位开发板上运行为32位编译的程序通常可以(如果系统支持32位兼容库)。 * 在32位开发板上运行为64编译的程序**一定**会失败。 3. **错误的编译方式 (Incorrect Compilation):** 如引用[1]所述,使用了`gcc -c`(只编译不链接)生成了目标文件(`.o`)而非真正的可执行文件,然后错误地尝试执行这个`.o`文件。不过,你提到的是`a.out`,通常代表链接后的可执行文件,所以这个原因可能性较低。 4. **执行权限 (Execute Permission):** 如引用[1]所述,文件缺少执行权限(`x`)。但错误信息通常是 `Permission denied` 而非 `Exec format error`。不过,检查一下权限总是好的。 **解决方案:使用交叉编译 (Cross-Compilation)** 解决这个问题的唯一正确方法是**在宿主机(PC)上,使用针对开发板CPU架构的交叉编译工具链(Cross-Compiler Toolchain)来编译你的程序**。 1. **确定开发板的精确架构:** * 通过ADB连接到开发板:`adb shell` * 在开发板的shell中运行命令:`uname -m` * 查看输出结果: * `armv7l`: 32位 ARM (常见于树莓派3及更早、许多嵌入式板) * `aarch64`: 64位 ARM (常见于树莓派4/5、NVIDIA Jetson、高通开发板) * `mips`, `mips64`, `riscv32`, `riscv64` 等 (其他嵌入式架构) 2. **获取对应的交叉编译工具链:** * 根据 `uname -m` 的结果,下载或安装针对该架构的交叉编译器。 * **常见工具链前缀:** * **32位 ARM (armv7l):** `arm-linux-gnueabihf-` (带硬件浮点支持) * **64位 ARM (aarch64):** `aarch64-linux-gnu-` * **其他架构:** 查找对应的工具链名称(如 `mipsel-linux-gnu-` 等)。 * **来源:** * 开发板厂商提供的SDK中通常包含。 * Linaro (针对ARM): https://www.linaro.org/downloads/ * 工具链项目网站 (如 `crosstool-NG`, `buildroot` 生成的工具链)。 * 操作系统发行版仓库 (如Ubuntu/Debian: `sudo apt install gcc-arm-linux-gnueabihf` 或 `gcc-aarch64-linux-gnu`)。 3. **在宿主机上进行交叉编译:** * 假设你的源代码文件是 `hello.c`。 * 假设你安装的工具链前缀是 `arm-linux-gnueabihf-` (针对32位ARM)。 * **编译命令:** ```bash # 对于32位ARM (armv7l) arm-linux-gnueabihf-gcc hello.c -o a.out # 或者静态链接,避免依赖动态库问题(可选,会增大文件体积) arm-linux-gnueabihf-gcc -static hello.c -o a.out # 对于64位ARM (aarch64) aarch64-linux-gnu-gcc hello.c -o a.out # 静态链接 aarch64-linux-gnu-gcc -static hello.c -o a.out ``` * 这个命令会在你的PC上生成一个名为 `a.out` 的可执行文件,但这个文件包含的是ARM指令,而不是PC的x86指令。 4. **传输并运行:** * 将交叉编译生成的 `a.out` 通过ADB推送到开发板: ```bash adb push a.out /data/local/tmp/ # 推送到开发板可执行目录 ``` * 通过ADB shell连接到开发板: ```bash adb shell ``` * 在开发板的shell中,进入文件所在目录并运行: ```bash cd /data/local/tmp chmod +x a.out # 确保有执行权限(通常adb push后需要) ./a.out ``` 5. **(可选)检查文件类型:** * 在**宿主机**上,检查交叉编译出的 `a.out` 文件类型: ```bash file a.out ``` * **期望输出示例 (32位 ARM):** `a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked/dynamically linked, ...` * **期望输出示例 (64位 ARM):** `a.out: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked/dynamically linked, ...` * 在**开发板**上,也可以检查传输过去的 `a.out` 文件类型(如果开发板有 `file` 命令): ```bash file ./a.out ``` 输出应显示为针对开发板架构(如 `ARM` 或 `aarch64`)的ELF可执行文件。 **总结关键步骤:** 1. **确认开发板架构** (`adb shell` + `uname -m`). 2. **获取匹配的交叉编译工具链** (如 `gcc-arm-linux-gnueabihf`, `gcc-aarch64-linux-gnu`). 3. **在PC上用交叉编译编译代码** (如 `arm-linux-gnueabihf-gcc hello.c -o a.out`). 4. **传输交叉编译好的 `a.out` 到开发板** (`adb push`). 5. **赋予执行权限** (`adb shell` + `chmod +x a.out`). 6. **在开发板上运行** (`./a.out`).
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值