点了网站域名会跳转,做资源网站赚钱吗,淘宝关键词排名怎么查询,杭州app开发定制json-c库交叉编译时报错 关注点错误出现的场景错误描述解决办法为啥?原因分析解决步骤总结 怎么看出来的?哦!get新知识 关注点
看文章前,我先告诉你重点,给我死死盯准文章里的EM: 3 #xff01;#xff01;#xff01;#xff01;#xff01;#xff01;#xff01;
错误出现的场景
./autogen.sh ./configure --hostarm-linux CCarm-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 文件是为不同的架构编译的其 ELFExecutable and Linkable Format头部标识EM: 3表示它是为 Intel 80386 架构编译的这与目标 ARM 架构不兼容。
原因分析
构建过程中的文件混淆可能在之前的构建中生成的 .o 文件没有被清理或者在配置过程中某些环境设置导致错误地使用了默认的编译器而不是交叉编译器 arm-linux-gcc。
解决步骤
彻底清理构建环境
在重新构建之前运行 make clean 或更彻底地删除构建目录下的所有生成文件确保没有旧的或为错误架构编译的文件残留。
make clean或者
rm -rf .libs *.o重新运行 autogen 和 configure
确保 autogen.sh 和 configure 脚本没有遗漏任何配置步骤。特别注意 configure 命令中的参数是否正确传递给了构建系统。
./autogen.sh
./configure --hostarm-linux --prefix/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/ CCarm-linux-gcc监控编译过程
在运行 make 时仔细观察是否有任何提示可能指向编译器配置错误或使用了错误的编译器。有时 configure 脚本可能正确配置了初始设置但实际编译过程中可能由于路径或环境变量设置问题使用了错误的工具。 4. 检查环境变量
确保 PATH 环境变量中交叉编译器的路径优先级高于系统默认的编译器路径。
export PATH/opt/FriendlyARM/toolschain/4.4.3/bin:$PATH确认 make 使用的编译器
你可以在 make 命令中添加 V1或在某些Makefile中可能是 VERBOSE1以显示更多编译和链接过程的详细信息
make V1这将帮助你验证是否真正使用了 arm-linux-gcc 作为编译器。
重新审查 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系统吧