在学习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权限因此通过交叉编译器来完成。