交叉编译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

posted @ 2026-01-19 21:08  上善若淼  阅读(0)  评论(0)    收藏  举报