linux交叉编译时报错 libfreetype.so: file not recognized: File format not recognized

root@ubuntu:/home/linuxsystemcode/04th_print_info# arm-none-linux-gnueabi-gcc -finput-charset=GBK -o example1 example1.c  -lfreetype -lm
/usr/local/arm/arm-2009q3/bin/../arm-none-linux-gnueabi/libc/lib/libfreetype.so: file not recognized: File format not recognized
collect2: ld returned 1 exit status

如上图,交叉编译的时候出现无法识别libfreetype.so文件的错误信息,到我们的交叉编译工具链的C库目录下使用以下命令查看该文件的格式

root@ubuntu:/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib# file libfreetype.so
libfreetype.so: symbolic link to `libfreetype.so.6.9.0'

通过返回的提示信息我们知道它指向libfreetype.so.6.9.0,于是我们再通过file命令查看libfreetype.so.6.9.0,发现是x86-64的,而我要编译的是arm版本的,所以这里报错了。问题的根源找到了,那怎么解决呢?

 

解决办法:在安装freetype的时候配置为ARM-Linux版本的即可,命令如下

tar xjf freetype-2.4.10.tar.bz2     解压
./configure --host=arm-none-linux-gnueabi        配置为ARM-Linux
make
make DESTDIR=$PWD/tmp install安装到一个临时目录,再把里面的头文件拷贝到我们的交叉编译工具链里面去



root@ubuntu:/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib# file libfreetype.so.6.9.0
libfreetype.so.6.9.0: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped    现在变成ARM版本的了

把tmp/usr/local/lib/*  复制到 /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib

把tmp/usr/local/include/*  复制到 /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/usr/include

 

 

参考文章:https://blog.csdn.net/u011113596/article/details/80325081

### 错误分析 此错误通常发生在链接阶段,当链接器尝试处理不兼容的库文件会触发该问题。具体来说: - 链接器无法识别 `.so` 文件格式,可能是因为目标平台与主机平台架构不同[^1]。 - 如果使用的是交叉编译工具链,则可能是试图链接为主机环境构建的共享库而非为目标架构构建的共享库[^2]。 - 此外,如果文件被截断或损坏,也可能引发类似的 `File truncated` 或 `file format not recognized` 的错误[^3]。 --- ### 解决方案 #### 方法一:确认库文件的目标架构 确保使用的共享库(`.so` 文件)是为目标架构编译的。可以通过以下命令验证库文件的架构: ```bash file libfreetype.so ``` 如果输出显示库文件为其他架构(如 x86_64),而当前正在使用 ARM 工具链进行交叉编译,则需要获取或重新编译适合目标架构的库文件。 #### 方法二:检查交叉编译工具链配置 对于交叉编译场景,需确保指定正确的路径来查找目标架构下的库文件。例如,在调用 GCC 可以显式设置 `-L` 参数指向目标库目录: ```bash arm-none-linux-gnueabi-gcc -finput-charset=GBK -o example1 example1.c \ -L/path/to/target/libs -lfreetype -lm ``` 同,建议通过 `--sysroot` 参数指定完整的根文件系统路径,以便工具链能够找到匹配的目标库文件: ```bash arm-none-linux-gnueabi-gcc --sysroot=/path/to/sysroot ... ``` #### 方法三:修复或替换损坏的库文件 如果问题是由于文件损坏引起的,则需要重新下载或重建对应的库文件。例如,可以从源码重新编译 FreeType 库并安装到适当位置。 #### 方法四:清理旧对象文件和中间产物 有项目中的某些临文件可能会干扰正常编译过程。执行以下操作清除残留数据后再试一次: ```bash make clean rm -rf *.o *.so ``` 最后再次运行原编译指令以观察效果。 --- ### 总结 上述方法涵盖了从确认依赖项一致性到排查潜在资源破坏等多个方面。实际应用过程中应逐一测试直至定位根本原因并解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值