交叉编译libmodbus
1️⃣ 下载源码
git clone https://github.com/stephane/libmodbus.git
cd libmodbus
如果是 git 源码(必须):
./autogen.sh
2️⃣ 导出工具链环境(关键)
export TOOLCHAIN=/home/rk3506/HZ-EVM-RK3506_MINI_SDK/buildroot/output/rockchip_rk3506/host/bin
export CC=${TOOLCHAIN}/arm-buildroot-linux-gnueabihf-gcc
export AR=${TOOLCHAIN}/arm-buildroot-linux-gnueabihf-ar
export LD=${TOOLCHAIN}/arm-buildroot-linux-gnueabihf-ld
export STRIP=${TOOLCHAIN}/arm-buildroot-linux-gnueabihf-strip
⚠ 不要只 export CC,一个不够
否则后面很容易混进宿主机的 ar / ld。
3️⃣ configure(核心命令)
强烈推荐 prefix 指向工程目录
./configure
--host=arm-buildroot-linux-gnueabihf
--prefix=/home/rk3506/third_party/libmodbus
--enable-shared
--disable-static
说明:
--host:告诉 autotools 这是交叉编译
--prefix:安装路径
--enable-shared:生成 .so
--disable-static:避免不必要的 .a
4️⃣ 编译 & 安装
make -j$(nproc)
make install
成功后安装路径下
├── include
│ └── modbus
│ ├── modbus-rtu.h
│ ├── modbus-tcp.h
│ ├── modbus-version.h
│ └── modbus.h
├── lib
│ ├── libmodbus.la
│ ├── libmodbus.so -> libmodbus.so.5.1.0
│ ├── libmodbus.so.5 -> libmodbus.so.5.1.0
│ ├── libmodbus.so.5.1.0
│ └── pkgconfig
│ └── libmodbus.pc
└── share
└── doc
└── libmodbus
├── AUTHORS
├── NEWS
└── README.md
5️⃣测试libmodbus
1.modbus_test.c
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <modbus/modbus.h>
int main(void)
{
modbus_t *ctx;
uint16_t tab_reg[10];
int rc;
ctx = modbus_new_rtu("/dev/ttyS1", 9600, 'N', 8, 1);
if (!ctx) {
perror("modbus_new_rtu");
return -1;
}
modbus_set_slave(ctx, 1);
/* 新版 libmodbus 正确超时设置方式 */
modbus_set_response_timeout(ctx, 1, 0);
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n",
modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
rc = modbus_read_registers(ctx, 0, 2, tab_reg);
if (rc == -1) {
fprintf(stderr, "Read failed: %s\n",
modbus_strerror(errno));
} else {
printf("Read %d registers:\n", rc);
for (int i = 0; i < rc; i++) {
printf("reg[%d] = %d\n", i, tab_reg[i]);
}
}
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
2.环境变量
export TOOLCHAIN=/home/rk3506/HZ-EVM-RK3506_MINI_SDK/buildroot/output/rockchip_rk3506/host/bin
export CC=${TOOLCHAIN}/arm-buildroot-linux-gnueabihf-gcc
3.编译命令
$CC modbus_test.c \
-I/home/rk3506/third_party/libmodbus/include \
-L/home/rk3506/third_party/libmodbus/lib \
-lmodbus \
-o modbus_test
4.文件拷贝到目标板
可执行文件拷贝到目标板
库拷贝到目标板
/home/rk3506/third_party/libmodbus/lib/libmodbus.so* 拷贝到目标板/usr/lib/,然后 ldconfig生效
5.执行可执行程序
./modbus_test

浙公网安备 33010602011771号