”file not recognized: file format not recognized“错误,不同架构动态库交叉编译的学习记录

发布时间 2023-04-11 13:41:21作者: 面筋玄师

在学习modbus协议时,发现了一些关于libmodbus库编译的问题

 

我将虚拟机作为客户端,树莓派作为服务器端,分别编写modbus-tcp协议的客户端/服务器端代码

在ubuntu虚拟机上可以成功编译,但是在树莓派上会报:”file not recognized: file format not recognized“错误

 

下面是关于”file not recognized: file format not recognized“错误“的常见原因

 

通过file命令查看动态库信息:

寻找了半天原因是因为ubuntu虚拟机(x86)和树莓派架构(arm)不同 ,因此我应该下载对应架构(arm)的libmodbus动态库文件

 

可以通过:下面命令查看架构信息或者详细信息

uname -m

uname -a

 

树莓派上架构:

 

 

附上arm架构的libmodbus动态库下载地址:Debian -- 在 stretch 中的 libmodbus5 软件包详细信息

 

 我第一次下载时错下成了arm64版本的lib,实际上应该下载armhf版本(对应armv71)

以下是一些拓展:

通过wget下载,下载的db文件通过”dpkg -x xxx.deb  文件路径”解压

 

我这里解压到arm-libmodbus文件夹中

 解压成功后文件夹中会出现usr目录

 

 一层层找最后找到我们需要的动态库文件

此时去编译写好的.c文件,注意:因为我当前使用的是pc上的ubuntu虚拟机,架构为x86,而我想通过arm架构的libmodbus动态库生成能在树莓派运行的可执行文件,因此这里涉及交叉编译相关知识。应该在ubuntu虚拟机下载交叉编译器,使得能编译出arm架构的可执行文件

 

交叉编译器我通过 " sudo apt-get install gcc-arm-linux-gnueabihf " 下载     (注意交叉编译器也有架构对应(hf))

 

 

编译时需要指定动态库路径(-L)和头文件路径(-I),也可以修改环境变量或者/usr/lib等方式,这里不再赘述。

 

如果你没有下载头文件,可以通过下面的命令下载,它默认保存在  /usr/include/modbus/目录中,编译时头文件路径指定为这里即可.

 

sudo apt-get install libmodbus-dev

 

 

 

 

 成功。

 

不知道在树莓派(或者arm架构设备)上直接使用sudo apt-get install libmodbus5 会不会直接能下载对应架构的库文件,我这里因为没有服务器root权限因此通过交叉编译器来完成。