json-c库交叉编译时报错

关注点

看文章前,我先告诉你重点,给我死死盯准文章里的EM: 3 !!!!!!!!!!!!!!!!!

错误出现的场景

./autogen.sh
./configure --host=arm-linux CC=arm-linux-gcc --prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/
都没报错,
make的时候就报错

错误描述

d: .libs/linkhash.o: Relocations in generic ELF (EM: 3)
/opt/FriendlyARM/toolschain/4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3/…/…/…/…/arm-none-linux-gnueabi/bin/ld:
.libs/linkhash.o: Relocations in generic ELF (EM: 3)
.libs/linkhash.o: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make[1]: *** [libjson.la] 错误 1
make[1]: Leaving directory `/home/FriendlyArm/json-c-master’
make: *** [all] 错误 2

解决办法

make clean一下

为啥?

错误信息表明在链接过程中遇到了架构兼容性问题。尽管你已经使用 configure 指定了正确的交叉编译器和主机类型,但仍然在构建 json-c 库时遇到了问题。错误中指出 .libs/linkhash.o 文件是为不同的架构编译的,其 ELF(Executable and Linkable Format)头部标识(EM: 3)表示它是为 Intel 80386 架构编译的,这与目标 ARM 架构不兼容。

原因分析

构建过程中的文件混淆:可能在之前的构建中生成的 .o 文件没有被清理,或者在配置过程中某些环境设置导致错误地使用了默认的编译器而不是交叉编译器 arm-linux-gcc。

解决步骤

  1. 彻底清理构建环境:

在重新构建之前,运行 make clean 或更彻底地删除构建目录下的所有生成文件,确保没有旧的或为错误架构编译的文件残留。

make clean
 或者
rm -rf .libs *.o
  1. 重新运行 autogen 和 configure:

确保 autogen.sh 和 configure 脚本没有遗漏任何配置步骤。特别注意 configure 命令中的参数是否正确传递给了构建系统。

./autogen.sh
./configure --host=arm-linux --prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/ CC=arm-linux-gcc
  1. 监控编译过程:

在运行 make 时,仔细观察是否有任何提示可能指向编译器配置错误或使用了错误的编译器。有时 configure 脚本可能正确配置了初始设置,但实际编译过程中可能由于路径或环境变量设置问题使用了错误的工具。
4. 检查环境变量:

确保 PATH 环境变量中交叉编译器的路径优先级高于系统默认的编译器路径。

export PATH=/opt/FriendlyARM/toolschain/4.4.3/bin:$PATH
  1. 确认 make 使用的编译器:

你可以在 make 命令中添加 V=1(或在某些Makefile中可能是 VERBOSE=1),以显示更多编译和链接过程的详细信息:

make V=1

这将帮助你验证是否真正使用了 arm-linux-gcc 作为编译器。

  1. 重新审查 configure 日志:

检查 config.log 文件以确认 configure 脚本是否真正识别并配置了所有的参数,尤其是交叉编译器相关的设置。

总结

二进制文件架构不兼容,生成的二进制文件不适合目标ARM环境。

怎么看出来的?

.libs/linkhash.o 文件是为 Intel 80386 架构编译的结论,主要是基于错误信息中的 EM: 3 标记。在 ELF (Executable and Linkable Format) 文件头部,EM 代表机器类型,是用于区分文件是为哪种处理器架构编译的。EM: 3 对应于 ELF 标准中定义的 EM_386,表示这个文件是为 32 位 Intel 80386 CPU 架构编译的。

在处理交叉编译问题或编译错误时,识别出文件是为错误的处理器架构编译的是解决编译错误的关键步骤。这通常意味着编译时使用的编译器不是为目标平台配置的,可能是由于配置错误、环境变量设置不当或其他原因导致默认编译器被错误使用。

这种情况在使用交叉编译环境时尤其常见,例如,如果你正在为 ARM 处理器编译,但是构建系统错误地使用了为 x86 架构配置的编译器,就会出现类似的错误。

要验证这一点,可以使用 file 命令检查 .o 文件的架构,如:

file .libs/linkhash.o

这将返回文件的详细信息,包括它是为哪种架构编译的。如果结果显示是为非 ARM 架构编译,这就确认了问题所在,并且需要调整编译器设置或修正交叉编译配置以确保使用正确的编译器。

哦!get新知识

make中的 EM: 3一般就代表架构不兼容,你window系统上的文件肯定不能直接兼容Linux系统吧

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在交叉编译环境下编译 json-c ,你需要进行以下步骤: 1. 准备交叉编译工具链:根据你的目标平台,获取相应的交叉编译工具链。这包括交叉编译器、交叉编译和头文件等。 2. 设置环境变量:将交叉编译工具链的路径添加到系统的环境变量中,以便构建过程可以找到正确的工具。 3. 获取 json-c 源代码:从 json-c 的官方仓(https://github.com/json-c/json-c)下载最新的源代码包,或者使用 Git 克隆仓。 4. 创建交叉编译目录:在源代码目录之外创建一个新的目录,用于进行交叉编译。这样可以保持源代码目录的干净和可重用性。 5. 配置交叉编译参数:进入交叉编译目录,并运行以下命令来配置 json-c 的构建过程: ``` <path_to_jsonc_source>/configure --host=<target_architecture> --prefix=<install_directory> ``` `<path_to_jsonc_source>` 是 json-c 源代码的路径,`<target_architecture>` 是目标平台的架构(如 arm-linux-gnueabihf),`<install_directory>` 是你希望安装 json-c 的路径。 6. 编译和安装:运行以下命令来编译和安装 json-c : ``` make make install ``` 7. 导入:将编译好的 json-c 和头文件复制到你的目标平台上,并在交叉编译环境中配置正确的搜索路径。 请注意,具体的步骤和命令可能会因你的目标平台和工具链而有所不同。在进行交叉编译,请参考相关文档和交叉编译工具链的说明来调整上述步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏过山河,踏过海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值