在嵌入式Linux开发中,我们经常需要与各种工业设备进行Modbus协议通信。mbpoll是一个轻量级的Modbus测试工具,可以方便地进行寄存器读写操作。但在嵌入式平台上,我们通常需要交叉编译才能运行这类工具。本文将详细介绍如何在x86主机上为ARM架构的嵌入式Linux系统交叉编译mbpoll工具链。
交叉编译mbpoll需要准备ARM架构的交叉编译工具链。推荐使用Linaro提供的arm-none-linux-gnueabihf工具链:
bash复制sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
安装完成后,可以通过以下命令验证工具链是否可用:
bash复制arm-linux-gnueabihf-gcc --version
mbpoll依赖于libmodbus库,我们需要先交叉编译这个基础库。建议在用户目录下创建工作目录:
bash复制mkdir -p ~/OpenSource
cd ~/OpenSource
mbpoll有两个主要的源码仓库可供选择:
Gitee镜像(国内访问更快):
bash复制git clone https://gitee.com/droidzxy/mbpoll.git
或者从Github获取最新版本:
bash复制git clone https://github.com/epsilonrt/mbpoll.git
同样地,libmodbus也有两个源码仓库:
Gitee镜像:
bash复制git clone https://gitee.com/idrm-iot/libmodbus.git
Github官方仓库:
bash复制git clone https://github.com/stephane/libmodbus.git
提示:国内用户建议优先使用Gitee镜像,下载速度更快且更稳定。
首先编译libmodbus库,这是mbpoll的依赖项:
bash复制cd libmodbus
mkdir install
./autogen.sh
配置编译参数时,需要特别注意以下几点:
--host指定目标平台架构--prefix设置安装目录--enable-static生成静态库--disable-shared禁用动态库完整配置命令:
bash复制./configure \
--host=arm-none-linux-gnueabihf \
--prefix=$PWD/install \
--enable-static \
--disable-shared
执行编译和安装:
bash复制make -j$(nproc)
make install
编译完成后,库文件将安装在~/OpenSource/libmodbus/install目录下。可以通过以下命令检查生成的文件:
bash复制ls -l install/lib/
应该能看到libmodbus.a静态库文件。
bash复制cd ../mbpoll
mkdir build
cd build
mbpoll使用CMake构建系统,需要特别注意以下几个关键参数:
完整配置命令:
bash复制cmake .. \
-DCMAKE_C_COMPILER=arm-none-linux-gnueabihf-gcc \
-DCMAKE_CXX_COMPILER=arm-none-linux-gnueabihf-g++ \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=arm \
-DCMAKE_FIND_ROOT_PATH=/home/xxx/OpenSource/libmodbus/install \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
-DCMAKE_PREFIX_PATH=/home/xxx/OpenSource/libmodbus/install \
-DCMAKE_INSTALL_PREFIX=$PWD/install
注意:请将
/home/xxx/OpenSource/libmodbus/install替换为你实际的libmodbus安装路径。
执行编译:
bash复制make -j$(nproc)
编译成功后,可以在当前目录下找到mbpoll可执行文件。可以使用file命令验证其架构:
bash复制file mbpoll
输出应该显示为ARM架构的ELF可执行文件。
问题1:执行autogen.sh时报错"autoreconf: not found"
解决方案:需要安装automake工具链:
bash复制sudo apt-get install autoconf automake libtool
问题2:configure阶段报错"cannot find arm-none-linux-gnueabihf-gcc"
解决方案:确认交叉编译工具链已正确安装,或检查PATH环境变量是否包含工具链路径。
问题1:CMake报错找不到libmodbus
解决方案:确认CMAKE_FIND_ROOT_PATH和CMAKE_PREFIX_PATH指向正确的libmodbus安装目录。
问题2:链接阶段报undefined reference错误
解决方案:检查libmodbus是否编译为静态库,并确认CMake配置中启用了静态链接。
将编译好的mbpoll可执行文件复制到目标设备上即可使用。基本使用示例:
bash复制# 读取保持寄存器
./mbpoll -a 1 -r 40001 -t 4 -c 10 192.168.1.100
# 写入单个寄存器
./mbpoll -a 1 -r 40001 -t 4 -w 1234 192.168.1.100
在实际项目中,我发现以下几点特别值得注意:
-Os优化选项减小二进制体积