”file not recognized: file format not recognized“错误,不同架构动态库交叉编译的学习记录
在学习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动态库文件
可以通过:下面命令查看架构信息或者详细信息
1 2 3 | 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/目录中,编译时头文件路径指定为这里即可.
1 | sudo apt-get install libmodbus-dev |
成功。
不知道在树莓派(或者arm架构设备)上直接使用sudo apt-get install libmodbus5
会不会直接能下载对应架构的库文件,我这里因为没有服务器root权限因此通过交叉编译器来完成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)