paho.mqtt.c的Linux编译与交叉编译

本文基于CentOS Linux 7.4,介绍了paho.mqtt.c库的编译安装。包含下载源码,普通编译安装和交叉编译安装步骤,还给出安装成功示例。同时提到使用注意事项,如不同版本对openssl依赖环境变量的修改,以及旧版本函数的bug及修复原理。

目录

一、下载源码

二、普通编译安装

三、交叉编译安装

四、安装成功示例

五、参考资料

六、paho.mqtt.c 使用注意事项


一、下载源码

git:Releases · eclipse/paho.mqtt.c · GitHub

下载稳定的C语言的发布版本

二、普通编译安装

注意:本人所述都是基于:CentOS Linux release 7.4 的操作,其它发行版本不保证一样!

解压源码后,进入解压后的主目录,如:cd paho.mqtt.c-1.3.0,按如下步骤执行命令:

  1. mkdir openssl_search_path_x86    创建openssl依赖路径
  2. cd openssl_search_path_x86    进入到刚刚新建的路径
  3. cp -r -d /home/workspace/openssl-1.0.2o_install_new/x86 ./  把已安装过的openssl库文件和头文件拷贝到新建的路径
  4. cd ../  回到主目录
  5. mkdir x86_build 创建cmake的build使用路径
  6. cd x86_build
  7. cmake -DPAHO_WITH_SSL=TRUE -DOPENSSL_SEARCH_PATH=/home/workspace/tools_3rdparty/paho.mqtt.c-1.3.0/openssl_search_path_x86 -DCMAKE_INSTALL_PREFIX=/home/workspace/tools_3rdparty/paho.mqtt.c-1.3.0/x86_install -DPAHO_BUILD_STATIC=TRUE ..  执行cmake,-DCMAKE_INSTALL_PREFIX 是指定paho最终的安装路径用的,-DPAHO_BUILD_STATIC表示需要生成静态库。
  8. make -j10 编译
  9. make install 安装
  • 说明:因为我安装的paho需要用到openssl这个库,当然,如果没必要,可以选择不使用openssl,即:前4步可以省略,第7步cmake的时候不使用对应的编译选项-DPAHO_WITH_SSL和-DOPENSSL_SEARCH_PATH即可,-DOPENSSL_SEARCH_PATH的作用是指定openssl的安装路径,是在openssl没有安装在默认路径下时使用的。
  • openssl的安装参考我另一篇文章:openssl的Linux编译与交叉编译
  • debug版本的编译,需要在第7步中,加上一个编译选项:-DCMAKE_BUILD_TYPE=Debug

三、交叉编译安装

与普通编译步骤一样,只是需要指定一下交叉编译器

  1. mkdir openssl_search_path_x3399    创建openssl依赖路径
  2. cd openssl_search_path_x3399   进入到刚刚新建的路径
  3. cp -r -d /home/workspace/openssl-1.0.2o_install_new/x3399 ./  把已安装过的openssl库文件和头文件拷贝到新建的路径
  4. cd ../  回到主目录
  5. mkdir x3399_build 创建cmake的build使用路径
  6. cd x3399_build
  7. cmake -DPAHO_WITH_SSL=TRUE -DOPENSSL_SEARCH_PATH=/home/workspace/tools_3rdparty/paho.mqtt.c-1.3.0/openssl_search_path_x3399 -DCMAKE_INSTALL_PREFIX=/home/workspace/tools_3rdparty/paho.mqtt.c-1.3.0/x3399_install -DPAHO_BUILD_STATIC=TRUE -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc .. 
    -DCMAKE_C_COMPILER表示指定自己的交叉编译器,自己提前安装配置好自己需要的交叉编译器。
  8. make -j10   编译
  9. make install  安装

四、安装成功示例

从图中可以看出,指定安装路径下的lib64下生成了动态库和对应的静态库文件,include下生成了头文件。

五、参考资料

paho.mqtt.c库交叉编译_fangye945a的博客-优快云博客_paho.mqtt交叉编译


六、paho.mqtt.c 使用注意事项

  • 注意:paho.mqtt.c-1.3.6 版本,openssl依赖的环境变量已经做了修改:OPENSSL_SEARCH_PATH 不再支持,可以使用 OPENSSL_ROOT_DIR 替代,或者用 OPENSSL_INC_SEARCH_PATH 指定头文件路径,用 OPENSSL_LIB_SEARCH_PATH 指定库文件路径
  • paho.mqtt.c-1.3.0 版本,当时发现 MQTTClient_retry 函数有个bug,如果把系统时间往前改(如改成昨天),会导致不发送心跳,从而断开连接,若你自己实现了断连重连机制,则会重复出现断开、连接、断开、连接的问题,自己可以临时修改源码,如下标红处,当然现在最新版已经修复了这个bug,原理是:使用"单调时间",即系统时间修改,不会影响两个时间差的结果,具体实现请参考最新版源码!

官方bug单: Mqtt disconnect after setting the system time · Issue #824 · eclipse/paho.mqtt.c · GitHub

为了对 `paho.mqtt.cpp` 进行交叉静态编译,需要完成以下步骤: ### 1. 准备交叉编译工具链 首先需要确保已经安装了目标平台的交叉编译工具链。例如,如果目标平台是 ARM 架构的 Linux 系统,则需要安装 `arm-linux-gnueabi-gcc` 工具链。可以通过以下命令安装: ```bash sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi ``` ### 2. 获取 `paho.mqtt.c` 和 `paho.mqtt.cpp` 源码 `paho.mqtt.cpp` 是基于 `paho.mqtt.c` 构建的 C++ 接口,因此需要分别获取这两个库的源代码: ```bash git clone https://github.com/eclipse/paho.mqtt.c.git git clone https://github.com/eclipse/paho.mqtt.cpp.git ``` ### 3. 编译并静态链接 `paho.mqtt.c` 进入 `paho.mqtt.c` 源码目录,使用 CMake 配置并编译静态库。需要指定交叉编译工具链和生成静态库: ```bash cd paho.mqtt.c mkdir build && cd build cmake -DCMAKE_C_COMPILER=arm-linux-gnueabi-gcc -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=arm -DBUILD_STATIC_LIBS=ON .. make ``` 编译完成后,`build` 目录下会生成静态库文件 `libpaho-mqtt3c.a`。 ### 4. 配置 `paho.mqtt.cpp` 的交叉编译环境 进入 `paho.mqtt.cpp` 源码目录,创建 `build` 目录,并配置交叉编译环境。需要指定 `paho.mqtt.c` 的静态库路径和头文件路径: ```bash cd ../paho.mqtt.cpp mkdir build && cd build cmake -DCMAKE_CXX_COMPILER=arm-linux-gnueabi-g++ -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=arm -DPahoC_DIR=../../paho.mqtt.c/build .. ``` 在上述命令中,`-DPahoC_DIR` 参数用于指定 `paho.mqtt.c` 的构建目录,以便 CMake 能够找到静态库和头文件。 ### 5. 编译 `paho.mqtt.cpp` 静态库 执行以下命令编译 `paho.mqtt.cpp` 静态库: ```bash make ``` 编译完成后,`build` 目录下会生成静态库文件 `libpaho-mqttpp3.a`。 ### 6. 验证交叉编译结果 可以通过 `file` 命令验证生成的静态库是否为目标平台的架构: ```bash file libpaho-mqttpp3.a ``` 输出应显示目标架构,例如 `ARM`。 ### 7. 使用静态库进行开发 在开发应用程序时,需要链接 `paho.mqtt.cpp` 和 `paho.mqtt.c` 的静态库,并确保包含相应的头文件。例如,编译一个简单的 MQTT 客户端程序: ```cpp #include <iostream> #include <mqtt/client.h> int main() { std::string address = "tcp://broker.hivemq.com:1883"; std::string clientId = "cpp_client"; mqtt::client client(address, clientId); mqtt::connect_options options; options.set_keep_alive_interval(20); options.set_clean_session(true); try { client.connect(options); std::cout << "Connected to MQTT broker." << std::endl; client.disconnect(); } catch (const mqtt::exception& exc) { std::cerr << "Error: " << exc.what() << std::endl; return 1; } return 0; } ``` 编译命令如下: ```bash arm-linux-gnueabi-g++ -o mqtt_client mqtt_client.cpp -I../../paho.mqtt.cpp/src -L../../paho.mqtt.cpp/build -lpaho-mqttpp3 -L../../paho.mqtt.c/build -lpaho-mqtt3c -lpthread ``` ### 8. 注意事项 - 确保交叉编译工具链目标平台的架构一致。 - 如果需要支持 TLS 加密,还需要交叉编译 OpenSSL 库,并在编译时链接 OpenSSL 的静态库。 - 在交叉编译过程中,可能会遇到依赖库的问题,需要确保所有依赖库都已正确交叉编译并链接。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值