在Ubuntu 2.04上如何按照x86_64架构编译libmodbus库

在Ubuntu上按x86_64架构编译libmodbus的核心步骤是使用本地GCC工具链(无需交叉编译),并通过configure脚本指定安装路径

以下是详细流程:

一、安装基础依赖

确保系统已安装编译工具和开发库:

bash 复制代码
sudo apt update
sudo apt install -y automake autoconf libtool gcc make

二、获取并解压源码

从官方仓库下载源码包(以3.1.11版本为例):

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

三、生成构建配置(仅Git版本需要)

如果源码未包含configure脚本,运行以下命令生成:

bash 复制代码
./autogen.sh

四、配置编译选项

指定安装路径(示例为/opt/libmodbus_x86_64):

bash 复制代码
./configure \
  --prefix=/opt/libmodbus_x86_64 \  # 安装路径
  --build=x86_64-linux-gnu          # 显式声明架构(可选)

关键参数说明:

  • --prefix:控制库和头文件的安装目录
  • --build:明确指定架构(通常可省略,configure会自动检测)

五、编译并安装

bash 复制代码
make -j$(nproc)      # 多线程编译
sudo make install    # 需要root权限写入系统目录

六、验证编译结果

  1. 检查库架构:
bash 复制代码
file /opt/libmodbus_x86_64/lib/libmodbus.so*

预期输出:

复制代码
ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, ...

测试简单程序:

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 context\n");
        return 1;
    }
    printf("Libmodbus x86_64 version: %s\n", LIBMODBUS_VERSION_STRING);
    modbus_free(ctx);
    return 0;
}
bash 复制代码
gcc test_modbus.c -o test_modbus \
  -I/opt/libmodbus_x86_64/include \
  -L/opt/libmodbus_x86_64/lib -lmodbus

export LD_LIBRARY_PATH=/opt/libmodbus_x86_64/lib:$LD_LIBRARY_PATH
./test_modbus

预期输出:

复制代码
Libmodbus x86_64 version: 3.1.11

如出现链接错误(未找到库)

临时解决方案:

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

永久解决方案:

bash 复制代码
echo "/opt/libmodbus_x86_64/lib" | sudo tee /etc/ld.so.conf.d/libmodbus_x86_64.conf
sudo ldconfig

关键点总结

步骤 关键命令/参数 作用
配置 ./configure --prefix=/opt/... 指定安装路径
编译 make -j$(nproc) 多线程加速编译
架构验证 file libmodbus.so 确认生成x86_64架构库
运行时路径配置 LD_LIBRARY_PATH或ldconfig 解决动态库加载问题

通过以上步骤,即可在Ubuntu上成功编译出适用于x86_64架构的libmodbus库。

相关推荐
阳光九叶草LXGZXJ1 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
奔跑的大白啊1 小时前
多容器共享目录权限踩坑记
linux·ubuntu·共享目录·linux权限·docker 容器化部署
黄大刀2 小时前
DataPulse一款开箱即用的SCADA(四)-历史记录
运维·scada·动环
归秋1424 小时前
2026 企业 AI 办公工具选型指南:从评估框架到产品适配
大数据·运维·人工智能
Android系统攻城狮4 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
H.莓飛5 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
91刘仁德5 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
硅基手札6 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
沫璃染墨8 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
工作10年+,存储芯片行业8 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie