libmodbus在Ubuntu 22.04上按arm64架构编译方法

1. 安装依赖工具

确保系统已安装automakeautoconflibtool和ARM64交叉编译工具链(如gcc-aarch64-linux-gnu):

bash 复制代码
sudo apt-get update
sudo apt-get install -y automake autoconf libtool gcc-aarch64-linux-gnu

2. 下载libmodbus源码

从官方仓库或发布页面获取源码(以3.1.10版本为例):

bash 复制代码
wget https://libmodbus.org/releases/libmodbus-3.1.10.tar.gz
tar -xzf libmodbus-3.1.10.tar.gz
cd libmodbus-3.1.10

或从github上拉去libmodbus源码:

bash 复制代码
git clone https://github.com/stephane/libmodbus.git

3. 生成构建配置(仅需Git版本)

如果源码未包含configure脚本,需运行autogen.sh生成:

./autogen.sh

4. 配置交叉编译选项

指定ARM64架构和安装路径(示例路径为/opt/libmodbus_arm64):

bash 复制代码
./configure \
  --host=aarch64-linux-gnu \  # 关键:指定ARM64交叉编译工具链前缀
  --prefix=/opt/libmodbus_arm64 \  # 安装路径
  CC=aarch64-linux-gnu-gcc \    # 显式指定交叉编译器(可选)
  CXX=aarch64-linux-gnu-g++

5. 编译并安装

bash 复制代码
make -j$(nproc)  # 多线程编译
make install      # 安装到指定路径

6. 验证编译结果

检查生成的库文件是否为ARM64架构:

bash 复制代码
file /opt/libmodbus_arm64/lib/libmodbus.so*

预期输出

bash 复制代码
/opt/libmodbus_arm64/lib/libmodbus.so:       symbolic link to libmodbus.so.5.1.0
/opt/libmodbus_arm64/lib/libmodbus.so.5:     symbolic link to libmodbus.so.5.1.0
/opt/libmodbus_arm64/lib/libmodbus.so.5.1.0: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=12bcbfd3bcffeb49cf349915764e6de6c3be8e36, with debug_info, not stripped

7. 在ARM64设备上使用

将编译生成的库文件(/opt/libmodbus_arm64/lib/)复制到目标设备的/usr/lib/或指定路径,并在程序中链接:

bash 复制代码
aarch64-linux-gnu-gcc modbus_test.c -o modbus_test \
  -I/opt/libmodbus_arm64/include \
  -L/opt/libmodbus_arm64/lib -lmodbus
./modbus_test

8.设置动态链接库,并使其永久生效:

bash 复制代码
export LD_LIBRARY_PATH=/opt/libmodbus_arm64/lib:$LD_LIBRARY_PATH

echo "/opt/libmodbus_arm64/lib" | sudo tee /etc/ld.so.conf.d/libmodbus_arm64.conf
sudo ldconfig

9.在ARM64设备上测试

将编译生成的库文件和头文件复制到目标设备后,编写一个简单测试程序验证功能:

cpp 复制代码
#include <modbus/modbus.h>
#include <stdio.h>

int main() {
    modbus_t *ctx = modbus_new_tcp("127.0.0.1", 1502);
    if (ctx == NULL) {
        fprintf(stderr, "Failed to create Modbus context\n");
        return -1;
    }
    printf("Modbus context created successfully!\n");
    modbus_free(ctx);
    return 0;
}

交叉编译并运行:

bash 复制代码
aarch64-linux-gnu-gcc test_modbus.c -o test_modbus \
  -I/opt/libmodbus_arm64/include \
  -L/opt/libmodbus_arm64/lib -lmodbus

# 复制到ARM64设备后运行(需确保库路径正确)
./test_modbus

预期输出

bash 复制代码
Modbus context created successfully!
相关推荐
IT布道1 小时前
[Git] 源码服务器主/备备份方案
运维·服务器·git
China_Yanhy1 小时前
AWS RDS PostgreSQL 大版本升级故障复盘与 SRE 最佳实践指南
运维·云计算·aws
学习是种信仰1 小时前
复现conda环境及Python 项目路径(PYTHONPATH)问题——基于Ubuntu
python·ubuntu·conda
神州数码云基地1 小时前
AI 驱动的自动化安全测试工具--Strix
运维·人工智能·功能测试·测试工具·自动化
IT菜鸟程1 小时前
Linux 系统安全加固实战:从密码策略到 SSH 访问控制
linux·ssh·系统安全
cen__y1 小时前
Linux10(计算机网络01)
linux·运维·服务器·c语言·计算机网络·ubuntu
minji...2 小时前
Linux 网络基础之UDP协议(四)传输层协议 UDP,再谈端口号,UDP 特点
linux·服务器·开发语言·网络·c++·tcp/ip·udp
emiya_saber2 小时前
docker cmd
linux·运维·docker
艾莉丝努力练剑2 小时前
【Linux网络】Linux 网络编程:应用层自定义协议与序列化(1)初识
linux·运维·服务器·网络·c++·udp·tcp