交叉编译paho.mqtt.c和paho.mqtt.cpp(MQTT客户端)

一、参考资料

【MQTT】paho.mqtt.cpp 库的 介绍、下载、交叉编译、MQTT客户端例子源码-CSDN博客

【MQTT】paho.mqtt.c 库的“介绍、下载、交叉编译” 详解,以及编写MQTT客户端例子源码-CSDN博客

二、准备工作

1. 重要说明

  • paho.mqtt.cpppaho.mqtt.c,务必版本对齐,否则导致编译失败。

在这里插入图片描述

  • 根据paho.mqtt.cpp版本来确定paho.mqtt.c的版本,先交叉编译paho.mqtt.cpp,然后交叉编译paho.mqtt.c

2. 编译环境

  • 宿主机:Ubuntu 20.04.6 LTS
  • Host:ARM32位。
  • 交叉编译器:arm-linux-gnueabihf-gcc-11.1.0

3. 设置交叉编译工具链

在交叉编译之前,需要设置交叉编译工具链的环境变量。

export PATH=/path/to/toolchains/arm-linux-gnueabihf/bin:$PATH

三、交叉编译paho.mqtt.cpp

1. 下载源码

下载源码:GitHub - eclipse-paho/paho.mqtt.cpp

下载并解压源码:

tar -xvzf paho.mqtt.cpp-1.5.2.tar.gz

2. 编译安装

cd paho.mqtt.cpp-1.5.2 && mkdir build# 编译带有 openssl 的库
cmake .. \-DCMAKE_INSTALL_PREFIX=/path/to/paho.mqtt.cpp/arm_install \-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \-DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \-DPAHO_WITH_MQTT_C=ON \-DPAHO_WITH_SSL=ON \  # 启用 SSL 支持-DOPENSSL_ROOT_DIR=/path/to/openssl/arm_install \ # OpenSSL 的交叉编译后路径-DPAHO_BUILD_STATIC=OFF \-DPAHO_BUILD_SAMPLES=OFF \  # 关闭示例编译-DPAHO_BUILD_TESTS=OFF \  # 关闭测试样例编译-DCMAKE_CXX_FLAGS="-std=c++11"make -j8
make install

安装后的文件目录:

yoyo@yoyo:~/360Downloads/paho.mqtt.cpp-1.5.2$ tree -L 4 arm_install/
arm_install/
├── bin
│   └── MQTTVersion
├── include
│   ├── mqtt
│   │   ├── async_client.h
│   │   ├── buffer_ref.h
│   │   ├── buffer_view.h
│   │   ├── callback.h
│   │   ├── client.h
│   │   ├── connect_options.h
│   │   ├── create_options.h
│   │   ├── delivery_token.h
│   │   ├── disconnect_options.h
│   │   ├── event.h
│   │   ├── exception.h
│   │   ├── export.h
│   │   ├── iaction_listener.h
│   │   ├── iasync_client.h
│   │   ├── iclient_persistence.h
│   │   ├── message.h
│   │   ├── platform.h
│   │   ├── properties.h
│   │   ├── reason_code.h
│   │   ├── response_options.h
│   │   ├── server_response.h
│   │   ├── ssl_options.h
│   │   ├── string_collection.h
│   │   ├── subscribe_options.h
│   │   ├── thread_queue.h
│   │   ├── token.h
│   │   ├── topic.h
│   │   ├── topic_matcher.h
│   │   ├── types.h
│   │   └── will_options.h
│   ├── MQTTAsync.h
│   ├── MQTTClient.h
│   ├── MQTTClientPersistence.h
│   ├── MQTTExportDeclarations.h
│   ├── MQTTProperties.h
│   ├── MQTTReasonCodes.h
│   └── MQTTSubscribeOpts.h
├── lib
│   ├── cmake
│   │   ├── eclipse-paho-mqtt-c
│   │   │   ├── eclipse-paho-mqtt-cConfig.cmake
│   │   │   ├── eclipse-paho-mqtt-cConfig-noconfig.cmake
│   │   │   └── eclipse-paho-mqtt-cConfigVersion.cmake
│   │   └── PahoMqttCpp
│   │       ├── PahoMqttCppConfig.cmake
│   │       ├── PahoMqttCppConfigVersion.cmake
│   │       ├── PahoMqttCppTargets.cmake
│   │       └── PahoMqttCppTargets-noconfig.cmake
│   ├── libpaho-mqtt3a.so -> libpaho-mqtt3a.so.1
│   ├── libpaho-mqtt3a.so.1 -> libpaho-mqtt3a.so.1.3.14
│   ├── libpaho-mqtt3a.so.1.3.14
│   ├── libpaho-mqtt3as.so -> libpaho-mqtt3as.so.1
│   ├── libpaho-mqtt3as.so.1 -> libpaho-mqtt3as.so.1.3.14
│   ├── libpaho-mqtt3as.so.1.3.14
│   ├── libpaho-mqtt3c.so -> libpaho-mqtt3c.so.1
│   ├── libpaho-mqtt3c.so.1 -> libpaho-mqtt3c.so.1.3.14
│   ├── libpaho-mqtt3c.so.1.3.14
│   ├── libpaho-mqtt3cs.so -> libpaho-mqtt3cs.so.1
│   ├── libpaho-mqtt3cs.so.1 -> libpaho-mqtt3cs.so.1.3.14
│   ├── libpaho-mqtt3cs.so.1.3.14
│   ├── libpaho-mqttpp3.so -> libpaho-mqttpp3.so.1
│   ├── libpaho-mqttpp3.so.1 -> libpaho-mqttpp3.so.1.5.1
│   └── libpaho-mqttpp3.so.1.5.1
└── share└── doc└── Eclipse Paho C├── CONTRIBUTING.md├── edl-v10├── epl-v20├── notice.html├── README.md└── samples

cmake 编译:

yoyo@yoyo:~/360Downloads/paho.mqtt.cpp-1.5.2/build$ cmake .. \
>   -DCMAKE_INSTALL_PREFIX=/path/to/paho.mqtt.cpp-1.5.2/arm_install \
>   -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \
>   -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \
>   -DPAHO_WITH_MQTT_C=ON \
>   -DPAHO_WITH_SSL=ON \
>   -DOPENSSL_ROOT_DIR=/path/to/openssl-openssl-3.5.0/arm_install \
>   -DPAHO_BUILD_STATIC=OFF \
>   -DPAHO_BUILD_SAMPLES=OFF \
>   -DPAHO_BUILD_TESTS=OFF \
>   -DCMAKE_CXX_FLAGS="-std=c++11"
-- The C compiler identification is GNU 11.1.0
-- The CXX compiler identification is GNU 11.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /path/to/toolchains/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /path/to/toolchains/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenSSL: /path/to/openssl-openssl-3.5.0/arm_install/lib/libcrypto.so (found version "3.5.0")
-- Paho C: Bundled
CMake Deprecation Warning at externals/paho-mqtt-c/CMakeLists.txt:18 (cmake_minimum_required):Compatibility with CMake < 3.10 will be removed from a future version ofCMake.Update the VERSION argument <min> value.  Or, use the <min>...<max> syntaxto tell CMake that the project requires at least <min> but has been updatedto work with policies introduced by <max> or earlier.-- CMake version: 3.31.3
-- CMake system name: Linux
-- Timestamp is 2025-04-14T06:10:16Z
-- Using OpenSSL with headers at /path/to/openssl-openssl-3.5.0/arm_install/include
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE
-- Creating shared library
-- Performing Test COMPILER_HAS_HIDDEN_VISIBILITY
-- Performing Test COMPILER_HAS_HIDDEN_VISIBILITY - Success
-- Performing Test COMPILER_HAS_HIDDEN_INLINE_VISIBILITY
-- Performing Test COMPILER_HAS_HIDDEN_INLINE_VISIBILITY - Success
-- Performing Test COMPILER_HAS_DEPRECATED_ATTR
-- Performing Test COMPILER_HAS_DEPRECATED_ATTR - Success
-- Configuring done (0.8s)
-- Generating done (0.0s)
-- Build files have been written to: /path/to/paho.mqtt.cpp-1.5.2/build

make 编译:

yoyo@yoyo:~/360Downloads/paho.mqtt.cpp-1.5.2/build$ make -j8
[  1%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/MQTTProtocolClient.c.o
[  2%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/MQTTProtocolClient.c.o
[  5%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/Clients.c.o
[  5%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/MQTTTime.c.o
[  8%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/Clients.c.o
[  8%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/MQTTTime.c.o
[  9%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/utf-8.c.o
[ 10%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/MQTTPacket.c.o
[ 12%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/utf-8.c.o
[ 13%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/MQTTPacketOut.c.o
[ 14%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/Messages.c.o
[ 16%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/Tree.c.o
[ 17%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/Socket.c.o
[ 18%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/MQTTPacket.c.o
[ 20%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/Log.c.o
[ 21%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/MQTTPersistence.c.o
[ 22%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/Thread.c.o
[ 24%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/MQTTProtocolOut.c.o
[ 25%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/MQTTPacketOut.c.o
[ 26%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/Messages.c.o
[ 28%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/MQTTPersistenceDefault.c.o
[ 29%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/SocketBuffer.c.o
[ 30%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/LinkedList.c.o
[ 32%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/Tree.c.o
[ 33%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/MQTTProperties.c.o
[ 34%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/MQTTReasonCodes.c.o
[ 36%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/Base64.c.o
[ 37%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/SHA1.c.o
[ 38%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/WebSocket.c.o
[ 40%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_obj.dir/Proxy.c.o
[ 41%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/Log.c.o
[ 42%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/Socket.c.o
[ 44%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/MQTTPersistence.c.o
[ 45%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/Thread.c.o
[ 46%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/MQTTProtocolOut.c.o
[ 48%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/MQTTPersistenceDefault.c.o
[ 49%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/SocketBuffer.c.o
[ 50%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/LinkedList.c.o
[ 50%] Built target common_obj
[ 52%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/MQTTProperties.c.o
[ 53%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/MQTTReasonCodes.c.o
[ 54%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/Base64.c.o
[ 56%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/SHA1.c.o
[ 57%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/WebSocket.c.o
[ 58%] Building C object externals/paho-mqtt-c/src/CMakeFiles/common_ssl_obj.dir/Proxy.c.o
[ 60%] Building C object externals/paho-mqtt-c/src/CMakeFiles/paho-mqtt3a.dir/MQTTAsync.c.o
[ 61%] Building C object externals/paho-mqtt-c/src/CMakeFiles/paho-mqtt3a.dir/MQTTAsyncUtils.c.o
[ 62%] Building C object externals/paho-mqtt-c/src/CMakeFiles/paho-mqtt3c.dir/MQTTClient.c.o
[ 62%] Built target common_ssl_obj
[ 64%] Building C object externals/paho-mqtt-c/src/CMakeFiles/paho-mqtt3cs.dir/MQTTClient.c.o
[ 65%] Building C object externals/paho-mqtt-c/src/CMakeFiles/paho-mqtt3as.dir/MQTTAsync.c.o
[ 66%] Building C object externals/paho-mqtt-c/src/CMakeFiles/paho-mqtt3as.dir/SSLSocket.c.o
[ 68%] Building C object externals/paho-mqtt-c/src/CMakeFiles/paho-mqtt3cs.dir/SSLSocket.c.o
[ 69%] Building C object externals/paho-mqtt-c/src/CMakeFiles/paho-mqtt3as.dir/MQTTAsyncUtils.c.o
[ 70%] Linking C shared library libpaho-mqtt3c.so
[ 72%] Linking C shared library libpaho-mqtt3a.so
[ 72%] Built target paho-mqtt3c
[ 72%] Built target paho-mqtt3a
[ 73%] Building C object externals/paho-mqtt-c/src/CMakeFiles/MQTTVersion.dir/MQTTVersion.c.o
[ 74%] Linking C executable MQTTVersion
[ 74%] Built target MQTTVersion
[ 76%] Linking C shared library libpaho-mqtt3cs.so
[ 77%] Linking C shared library libpaho-mqtt3as.so
[ 77%] Built target paho-mqtt3cs
[ 77%] Built target paho-mqtt3as
[ 78%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/async_client.cpp.o
[ 80%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/client.cpp.o
[ 81%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/create_options.cpp.o
[ 82%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/connect_options.cpp.o
[ 84%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/disconnect_options.cpp.o
[ 85%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/iclient_persistence.cpp.o
[ 86%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/message.cpp.o
[ 88%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/properties.cpp.o
[ 89%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/reason_code.cpp.o
[ 90%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/response_options.cpp.o
[ 92%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/server_response.cpp.o
[ 93%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/ssl_options.cpp.o
[ 94%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/string_collection.cpp.o
[ 96%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/token.cpp.o
[ 97%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/topic.cpp.o
[ 98%] Building CXX object src/CMakeFiles/paho-mqttpp3-shared.dir/will_options.cpp.o
[100%] Linking CXX shared library libpaho-mqttpp3.so
[100%] Built target paho-mqttpp3-shared

make install 安装:

yoyo@yoyo:~/360Downloads/paho.mqtt.cpp-1.5.2/build$ make install
[ 29%] Built target common_obj
[ 33%] Built target paho-mqtt3a
[ 36%] Built target paho-mqtt3c
[ 38%] Built target MQTTVersion
[ 68%] Built target common_ssl_obj
[ 72%] Built target paho-mqtt3cs
[ 77%] Built target paho-mqtt3as
[100%] Built target paho-mqttpp3-shared
Install the project...
-- Install configuration: ""
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3a.so.1.3.14
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3a.so.1
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3a.so
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3as.so.1.3.14
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3as.so.1
-- Set non-toolchain portion of runtime path of "/path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3as.so.1.3.14" to ""
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3as.so
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/export.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/MQTTAsync_publish.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/MQTTAsync_publish_time.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/MQTTAsync_subscribe.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/MQTTClient_publish.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/MQTTClient_publish_async.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/MQTTClient_subscribe.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/paho_c_pub.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/paho_c_sub.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/paho_cs_pub.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/paho_cs_sub.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/samples/pubsub_opts.c
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/CONTRIBUTING.md
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/epl-v20
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/edl-v10
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/README.md
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/share/doc/Eclipse Paho C/notice.html
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3c.so.1.3.14
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3c.so.1
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3c.so
-- Up-to-date: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3a.so.1.3.14
-- Up-to-date: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3a.so.1
-- Up-to-date: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3a.so
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/bin/MQTTVersion
-- Set non-toolchain portion of runtime path of "/path/to/paho.mqtt.cpp-1.5.2/arm_install/bin/MQTTVersion" to ""
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/MQTTAsync.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/MQTTClient.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/MQTTClientPersistence.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/MQTTProperties.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/MQTTReasonCodes.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/MQTTSubscribeOpts.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/MQTTExportDeclarations.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3cs.so.1.3.14
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3cs.so.1
-- Set non-toolchain portion of runtime path of "/path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3cs.so.1.3.14" to ""
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3cs.so
-- Up-to-date: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3as.so.1.3.14
-- Up-to-date: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3as.so.1
-- Up-to-date: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqtt3as.so
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/cmake/eclipse-paho-mqtt-c/eclipse-paho-mqtt-cConfig.cmake
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/cmake/eclipse-paho-mqtt-c/eclipse-paho-mqtt-cConfig-noconfig.cmake
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/cmake/eclipse-paho-mqtt-c/eclipse-paho-mqtt-cConfigVersion.cmake
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/async_client.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/buffer_ref.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/buffer_view.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/callback.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/client.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/connect_options.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/create_options.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/delivery_token.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/disconnect_options.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/event.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/exception.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/export.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/iaction_listener.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/iasync_client.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/iclient_persistence.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/message.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/platform.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/properties.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/reason_code.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/response_options.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/server_response.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/ssl_options.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/string_collection.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/subscribe_options.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/thread_queue.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/token.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/topic_matcher.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/topic.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/types.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/mqtt/will_options.h
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqttpp3.so.1.5.1
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqttpp3.so.1
-- Set non-toolchain portion of runtime path of "/path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqttpp3.so.1.5.1" to ""
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/libpaho-mqttpp3.so
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/cmake/PahoMqttCpp/PahoMqttCppTargets.cmake
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/cmake/PahoMqttCpp/PahoMqttCppTargets-noconfig.cmake
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/cmake/PahoMqttCpp/PahoMqttCppConfig.cmake
-- Installing: /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/cmake/PahoMqttCpp/PahoMqttCppConfigVersion.cmake

3. 移植到开发板

cp -arf /path/to/paho.mqtt.cpp/arm_install/lib/ /usr/paho.mqtt.cpp/

4. 简单示例

4.1 订阅——async_subscribe.cpp

这是使用了 libpaho-mqttpp3.so 进行订阅消息的源码,源码路径在源码的这个路径:paho.mqtt.cpp-1.5.2/examples/async_subscribe.cpp,只更改了服务器地址。完整代码如下:

// async_subscribe.cpp
//
// This is a Paho MQTT C++ client, sample application.
//
// This application is an MQTT subscriber using the C++ asynchronous client
// interface, employing callbacks to receive messages and status updates.
//
// The sample demonstrates:
//  - Connecting to an MQTT server/broker using MQTT v3.
//  - Subscribing to a topic
//  - Receiving messages through the callback API
//  - Receiving network disconnect updates and attempting manual reconnects.
//  - Using a "clean session" and manually re-subscribing to topics on
//    reconnect.
///******************************************************************************** Copyright (c) 2013-2025 Frank Pagliughi <fpagliughi@mindspring.com>** All rights reserved. This program and the accompanying materials* are made available under the terms of the Eclipse Public License v2.0* and Eclipse Distribution License v1.0 which accompany this distribution.** The Eclipse Public License is available at*    http://www.eclipse.org/legal/epl-v20.html* and the Eclipse Distribution License is available at*   http://www.eclipse.org/org/documents/edl-v10.php.** Contributors:*    Frank Pagliughi - initial implementation and documentation*******************************************************************************/#include <cctype>
#include <chrono>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <thread>#include "mqtt/async_client.h"const std::string DFLT_SERVER_URI("192.168.33.1:1883");
//const std::string DFLT_SERVER_URI("mqtt://localhost:1883");
const std::string CLIENT_ID("paho_cpp_async_subscribe");const std::string TOPIC("#");const int QOS = 1;
const int N_RETRY_ATTEMPTS = 5;/// Callbacks for the success or failures of requested actions.
// This could be used to initiate further action, but here we just log the
// results to the console.class action_listener : public virtual mqtt::iaction_listener
{std::string name_;void on_failure(const mqtt::token& tok) override{std::cout << name_ << " failure";if (tok.get_message_id() != 0)std::cout << " for token: [" << tok.get_message_id() << "]" << std::endl;std::cout << std::endl;}void on_success(const mqtt::token& tok) override{std::cout << name_ << " success";if (tok.get_message_id() != 0)std::cout << " for token: [" << tok.get_message_id() << "]" << std::endl;auto top = tok.get_topics();if (top && !top->empty())std::cout << "\ttoken topic: '" << (*top)[0] << "', ..." << std::endl;std::cout << std::endl;}public:action_listener(const std::string& name) : name_(name) {}
};//*** Local callback & listener class for use with the client connection.* This is primarily intended to receive messages, but it will also monitor* the connection to the broker. If the connection is lost, it will attempt* to restore the connection and re-subscribe to the topic.*/
class callback : public virtual mqtt::callback, public virtual mqtt::iaction_listener{// Counter for the number of connection retriesint nretry_;// The MQTT clientmqtt::async_client& cli_;// Options to use if we need to reconnectmqtt::connect_options& connOpts_;// An action listener to display the result of actions.action_listener subListener_;// This deomonstrates manually reconnecting to the broker by calling// connect() again. This is a possibility for an application that keeps// a copy of it's original connect_options, or if the app wants to// reconnect with different options.// Another way this can be done manually, if using the same options, is// to just call the async_client::reconnect() method.void reconnect(){std::this_thread::sleep_for(std::chrono::milliseconds(2500));try {cli_.connect(connOpts_, nullptr, *this);}catch (const mqtt::exception& exc) {std::cerr << "Error: " << exc.what() << std::endl;exit(1);}}// Re-connection failurevoid on_failure(const mqtt::token& tok) override{std::cout << "Connection attempt failed" << std::endl;if (++nretry_ > N_RETRY_ATTEMPTS)exit(1);reconnect();}// (Re)connection success// Either this or connected() can be used for callbacks.void on_success(const mqtt::token& tok) override {}// (Re)connection successvoid connected(const std::string& cause) override{std::cout << "\nConnection success" << std::endl;std::cout << "\nSubscribing to topic '" << TOPIC << "'\n"<< "\tfor client " << CLIENT_ID << " using QoS" << QOS << "\n"<< "\nPress Q<Enter> to quit\n"<< std::endl;cli_.subscribe(TOPIC, QOS, nullptr, subListener_);}// Callback for when the connection is lost.// This will initiate the attempt to manually reconnect.void connection_lost(const std::string& cause) override{std::cout << "\nConnection lost" << std::endl;if (!cause.empty())std::cout << "\tcause: " << cause << std::endl;std::cout << "Reconnecting..." << std::endl;nretry_ = 0;reconnect();}// Callback for when a message arrives.void message_arrived(mqtt::const_message_ptr msg) override{std::cout << "Message arrived" << std::endl;std::cout << "\ttopic: '" << msg->get_topic() << "'" << std::endl;std::cout << "\tpayload: '" << msg->to_string() << "'\n" << std::endl;}void delivery_complete(mqtt::delivery_token_ptr token) override {}public:callback(mqtt::async_client& cli, mqtt::connect_options& connOpts): nretry_(0), cli_(cli), connOpts_(connOpts), subListener_("Subscription"){}
};/int main(int argc, char* argv[])
{// A subscriber often wants the server to remember its messages when its// disconnected. In that case, it needs a unique ClientID and a// non-clean session.auto serverURI = (argc > 1) ? std::string{argv[1]} : DFLT_SERVER_URI;mqtt::async_client cli(serverURI, CLIENT_ID);mqtt::connect_options connOpts;connOpts.set_clean_session(false);// Install the callback(s) before connecting.callback cb(cli, connOpts);cli.set_callback(cb);// Start the connection.// When completed, the callback will subscribe to topic.try {std::cout << "Connecting to the MQTT server '" << serverURI << "'..." << std::flush;cli.connect(connOpts, nullptr, cb);}catch (const mqtt::exception& exc) {std::cerr << "\nERROR: Unable to connect to MQTT server: '" << serverURI << "'" << exc<< std::endl;return 1;}// Just block till user tells us to quit.while (std::tolower(std::cin.get()) != 'q');// Disconnecttry {std::cout << "\nDisconnecting from the MQTT server..." << std::flush;cli.disconnect()->wait();std::cout << "OK" << std::endl;}catch (const mqtt::exception& exc) {std::cerr << exc << std::endl;return 1;}return 0;
}

交叉编译:

arm-linux-gnueabihf-g++ async_subscribe.cpp -I /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/ -I /path/to/paho.mqtt.c-1.3.14/arm_install/include/ -I /path/to/openssl-openssl-3.5.0/arm_install/include/ -L /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/ -l paho-mqttpp3 -l paho-mqtt3a -l paho-mqtt3as -L /path/to/paho.mqtt.c-1.3.14/arm_install/lib/ -L /path/to/openssl-openssl-3.5.0/arm_install/lib/ -l crypto -l ssl -o async_subscribe

在arm开发板中运行:

/customer/mqtt_test # ./async_subscribe
Connecting to the MQTT server '192.168.33.1:1883'...
Connection successSubscribing to topic '#'for client paho_cpp_async_subscribe using QoS1Press Q<Enter> to quitMessage arrivedtopic: 'hello'payload: 'Hello World!'Message arrivedtopic: 'hello'payload: 'Hi there!'Subscription success for token: [1]token topic: '#', ...

4.2 发布——async_publish.cpp

这是使用了 libpaho-mqttpp3.so 进行发布消息的源码,源码路径在源码的这个路径:paho.mqtt.cpp-1.5.2/examples/async_publish.cpp,只更改了服务器地址。完整代码如下:

// async_publish.cpp
//
// This is a Paho MQTT C++ client, sample application.
//
// It's an example of how to send messages as an MQTT publisher using the
// C++ asynchronous client interface.
//
// The sample demonstrates:
//  - Connecting to an MQTT server/broker
//  - Using a connect timeout
//  - Publishing messages
//  - Default file persistence
//  - Last will and testament
//  - Using asynchronous tokens
//  - Implementing callbacks and action listeners
///******************************************************************************** Copyright (c) 2013-2023 Frank Pagliughi <fpagliughi@mindspring.com>** All rights reserved. This program and the accompanying materials* are made available under the terms of the Eclipse Public License v2.0* and Eclipse Distribution License v1.0 which accompany this distribution.** The Eclipse Public License is available at*    http://www.eclipse.org/legal/epl-v20.html* and the Eclipse Distribution License is available at*   http://www.eclipse.org/org/documents/edl-v10.php.** Contributors:*    Frank Pagliughi - initial implementation and documentation*******************************************************************************/#include <atomic>
#include <chrono>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <thread>#include "mqtt/async_client.h"using namespace std;
using namespace std::chrono;const string DFLT_SERVER_URI{"192.168.33.1:1883"};
//const string DFLT_SERVER_URI{"mqtt://localhost:1883"};
const string CLIENT_ID{"paho_cpp_async_publish"};const mqtt::persistence_type PERSIST_DIR{"./persist"};const string TOPIC{"hello"};const string PAYLOAD1{"Hello World!"};
const string PAYLOAD2{"Hi there!"};
const string PAYLOAD3{"Is anyone listening?"};
const string PAYLOAD4{"Someone is always listening."};const string LWT_PAYLOAD{"Last will and testament."};const int QOS = 1;const auto TIMEOUT = std::chrono::seconds(10);//*** A callback class for use with the main MQTT client.*/
class callback : public virtual mqtt::callback
{
public:void connection_lost(const string& cause) override{cout << "\nConnection lost" << endl;if (!cause.empty())cout << "\tcause: " << cause << endl;}void delivery_complete(mqtt::delivery_token_ptr tok) override{cout << "\tDelivery complete for token: " << (tok ? tok->get_message_id() : -1)<< endl;}
};//*** A base action listener.*/
class action_listener : public virtual mqtt::iaction_listener
{
protected:void on_failure(const mqtt::token& tok) override{cout << "\tListener failure for token: " << tok.get_message_id() << endl;}void on_success(const mqtt::token& tok) override{cout << "\tListener success for token: " << tok.get_message_id() << endl;}
};//*** A derived action listener for publish events.*/
class delivery_action_listener : public action_listener
{atomic<bool> done_;void on_failure(const mqtt::token& tok) override{action_listener::on_failure(tok);done_ = true;}void on_success(const mqtt::token& tok) override{action_listener::on_success(tok);done_ = true;}public:delivery_action_listener() : done_(false) {}bool is_done() const { return done_; }
};/int main(int argc, char* argv[])
{// A client that just publishes normally doesn't need a persistent// session or Client ID unless it's using persistence, then the local// library requires an ID to identify the persistence files.string serverURI = (argc > 1) ? string{argv[1]} : DFLT_SERVER_URI,clientID = (argc > 2) ? string{argv[2]} : CLIENT_ID;cout << "Initializing for server '" << serverURI << "'..." << endl;mqtt::async_client client(serverURI, clientID, PERSIST_DIR);callback cb;client.set_callback(cb);auto connOpts = mqtt::connect_options_builder().connect_timeout(5s).clean_session().will(mqtt::message(TOPIC, LWT_PAYLOAD, QOS, false)).finalize();cout << "  ...OK" << endl;try {cout << "\nConnecting..." << endl;mqtt::token_ptr conntok = client.connect(connOpts);cout << "Waiting for the connection..." << endl;conntok->wait();cout << "  ...OK" << endl;// First use a message pointer.cout << "\nSending message..." << endl;mqtt::message_ptr pubmsg = mqtt::make_message(TOPIC, PAYLOAD1);pubmsg->set_qos(QOS);client.publish(pubmsg)->wait_for(TIMEOUT);cout << "  ...OK" << endl;// Now try with itemized publish.cout << "\nSending next message..." << endl;mqtt::delivery_token_ptr pubtok;pubtok = client.publish(TOPIC, PAYLOAD2, QOS, false);cout << "  ...with token: " << pubtok->get_message_id() << endl;cout << "  ...for message with " << pubtok->get_message()->get_payload().size()<< " bytes" << endl;pubtok->wait_for(TIMEOUT);cout << "  ...OK" << endl;// Now try with a listenercout << "\nSending next message..." << endl;action_listener listener;pubmsg = mqtt::make_message(TOPIC, PAYLOAD3);pubtok = client.publish(pubmsg, nullptr, listener);pubtok->wait();cout << "  ...OK" << endl;// Finally try with a listener, but no tokencout << "\nSending final message..." << endl;delivery_action_listener deliveryListener;pubmsg = mqtt::make_message(TOPIC, PAYLOAD4);client.publish(pubmsg, nullptr, deliveryListener);while (!deliveryListener.is_done()) {this_thread::sleep_for(std::chrono::milliseconds(100));}cout << "OK" << endl;// Double check that there are no pending tokensauto toks = client.get_pending_delivery_tokens();if (!toks.empty())cout << "Error: There are pending delivery tokens!" << endl;// Disconnectcout << "\nDisconnecting..." << endl;client.disconnect()->wait();cout << "  ...OK" << endl;}catch (const mqtt::exception& exc) {cerr << exc.what() << endl;return 1;}return 0;
}

交叉编译:

arm-linux-gnueabihf-g++ async_publish.cpp -I /path/to/paho.mqtt.cpp-1.5.2/arm_install/include/ -I /path/to/paho.mqtt.c-1.3.14/arm_install/include/ -I /path/to/openssl-openssl-3.5.0/arm_install/include/ -L /path/to/paho.mqtt.cpp-1.5.2/arm_install/lib/ -l paho-mqttpp3 -l paho-mqtt3a -l paho-mqtt3as -L /path/to/paho.mqtt.c-1.3.14/arm_install/lib/ -L /path/to/openssl-openssl-3.5.0/arm_install/lib/ -l crypto -l ssl -l pthread -o async_publish

在arm开发板中运行:

/customer/mqtt_test # ./async_publish
Initializing for server '192.168.33.1:1883'......OKConnecting...
Waiting for the connection......OKSending message......OKSending next message...Delivery complete for token: 1...with token: 2...for message with 9 bytesDelivery complete for token: 2...OKSending next message...Listener success for token: 0...OKSending final message...Listener success for token: 0
OKDisconnecting......OK

四、交叉编译paho.mqtt.c

1. 下载源码

下载源码:[GitHub - eclipse-paho/paho.mqtt.c](https://eclipse-paho.github.io/paho.mqtt.c/ https://github.com/eclipse-paho/paho.mqtt.c)

git clone https://github.com/eclipse-paho/paho.mqtt.c.git

2. 编译安装

mkdir build && cd buildcmake ..\-DCMAKE_BUILD_TYPE=Release \-DCMAKE_INSTALL_PREFIX=/path/to/paho.mqtt.c/arm_install-DCMAKE_SYSTEM_NAME=Linux \-DCMAKE_SYSTEM_PROCESSOR=arm \        # 目标平台架构(如 arm/aarch64)-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \-DPAHO_WITH_SSL=ON \                 # 启用 SSL 支持-DOPENSSL_ROOT_DIR=/path/to/openssl/arm_install \ # OpenSSL 的交叉编译后路径-DPAHO_BUILD_STATIC=OFF \             # 生成静态库-DPAHO_BUILD_DOCUMENTATION=OFF \     # 关闭文档生成-DPAHO_BUILD_SAMPLES=OFF           # 关闭示例编译make -j8
make install

编译安装后的文件目录:

yoyo@yoyo:~/360Downloads/paho.mqtt.c-1.3.14$ tree -L 2 arm_install/
arm_install/
├── bin
│   └── MQTTVersion
├── include
│   ├── MQTTAsync.h
│   ├── MQTTClient.h
│   ├── MQTTClientPersistence.h
│   ├── MQTTExportDeclarations.h
│   ├── MQTTProperties.h
│   ├── MQTTReasonCodes.h
│   └── MQTTSubscribeOpts.h
├── lib
│   ├── cmake
│   ├── libpaho-mqtt3a.so -> libpaho-mqtt3a.so.1
│   ├── libpaho-mqtt3a.so.1 -> libpaho-mqtt3a.so.1.3.14
│   ├── libpaho-mqtt3a.so.1.3.14
│   ├── libpaho-mqtt3as.so -> libpaho-mqtt3as.so.1
│   ├── libpaho-mqtt3as.so.1 -> libpaho-mqtt3as.so.1.3.14
│   ├── libpaho-mqtt3as.so.1.3.14
│   ├── libpaho-mqtt3c.so -> libpaho-mqtt3c.so.1
│   ├── libpaho-mqtt3c.so.1 -> libpaho-mqtt3c.so.1.3.14
│   ├── libpaho-mqtt3c.so.1.3.14
│   ├── libpaho-mqtt3cs.so -> libpaho-mqtt3cs.so.1
│   ├── libpaho-mqtt3cs.so.1 -> libpaho-mqtt3cs.so.1.3.14
│   └── libpaho-mqtt3cs.so.1.3.14
└── share└── doc

paho.mqtt.c 库编译后会生成四个动态库:

  • libpaho-mqtt3a.so异步paho.mqtt.c 库。
  • libpaho-mqtt3as.so异步的、使用了SSL的paho.mqtt.c库。
  • libpaho-mqtt3c.so:经典的、同步的paho.mqtt.c库。
  • libpaho-mqtt3cs.so:经典的、同步的、使用了SSL的 paho.mqtt.c 库。

异步和同步库的区别:Paho MQTT C Client Library: Asynchronous vs synchronous client applications

cmake编译:

yoyo@yoyo:~/360Downloads/paho.mqtt.c-1.3.14/build$ cmake -DCMAKE_BUILD_TYPE=Release \
>   -DCMAKE_INSTALL_PREFIX=/path/to/paho.mqtt.c-1.3.14/arm_install \
>   -DCMAKE_SYSTEM_NAME=Linux \
>   -DCMAKE_SYSTEM_PROCESSOR=arm \
>   -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \
>   -DPAHO_WITH_SSL=ON \
>   -DOPENSSL_ROOT_DIR=/path/to/openssl-openssl-3.5.0/arm_install \
>   -DPAHO_BUILD_STATIC=OFF \
>   -DPAHO_BUILD_DOCUMENTATION=OFF \
>   -DPAHO_BUILD_SAMPLES=OFF ..
CMake Deprecation Warning at CMakeLists.txt:18 (cmake_minimum_required):Compatibility with CMake < 3.10 will be removed from a future version ofCMake.Update the VERSION argument <min> value.  Or, use the <min>...<max> syntaxto tell CMake that the project requires at least <min> but has been updatedto work with policies introduced by <max> or earlier.-- The C compiler identification is GNU 11.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /path/to/toolchains/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- CMake version: 3.31.3
-- CMake system name: Linux
-- Timestamp is 2025-04-14T03:30:34Z
-- Found OpenSSL: /path/to/openssl-openssl-3.5.0/arm_install/lib/libcrypto.so (found version "3.5.0")
-- Using OpenSSL with headers at /path/to/openssl-openssl-3.5.0/arm_install/include
-- Configuring done (0.2s)
-- Generating done (0.1s)
-- Build files have been written to: /path/to/paho.mqtt.c-1.3.14/build

make 编译:

yoyo@yoyo:~/360Downloads/paho.mqtt.c-1.3.14/build$ make -j8
[  3%] Built target thread
[ 27%] Built target common_obj
[ 52%] Built target common_ssl_obj
[ 53%] Building C object src/CMakeFiles/paho-mqtt3c.dir/MQTTClient.c.o
[ 54%] Building C object src/CMakeFiles/paho-mqtt3a.dir/MQTTAsync.c.o
[ 55%] Building C object src/CMakeFiles/paho-mqtt3cs.dir/MQTTClient.c.o
[ 56%] Building C object src/CMakeFiles/paho-mqtt3as.dir/MQTTAsync.c.o
[ 58%] Linking C shared library libpaho-mqtt3a.so
[ 59%] Built target paho-mqtt3a
[ 60%] Linking C executable test4
[ 61%] Linking C executable test45
[ 62%] Linking C executable test6
[ 63%] Linking C executable test8
[ 64%] Linking C executable test9
[ 65%] Built target test6
[ 65%] Built target test45
[ 66%] Built target test4
[ 67%] Linking C executable test95
[ 69%] Linking C shared library libpaho-mqtt3as.so
[ 69%] Built target test8
[ 72%] Linking C executable test11
[ 72%] Built target test9
[ 73%] Linking C executable test_issue373
[ 74%] Built target test95
[ 75%] Built target test11
[ 76%] Built target test_issue373
[ 77%] Built target paho-mqtt3as
[ 78%] Linking C executable test5
[ 79%] Linking C shared library libpaho-mqtt3c.so
[ 79%] Built target paho-mqtt3c
[ 80%] Linking C executable test1
[ 81%] Built target test5
[ 82%] Linking C executable test2
[ 83%] Linking C executable test_sync_session_present
[ 84%] Linking C executable MQTTVersion
[ 86%] Linking C executable test15
[ 87%] Linking C executable test10
[ 88%] Linking C executable test_connect_destroy
[ 89%] Built target test15
[ 90%] Built target test2
[ 91%] Built target test_sync_session_present
[ 92%] Built target MQTTVersion
[ 93%] Built target test1
[ 94%] Built target test10
[ 95%] Built target test_connect_destroy
[ 96%] Linking C shared library libpaho-mqtt3cs.so
[ 97%] Built target paho-mqtt3cs
[ 98%] Linking C executable test3
[100%] Built target test3

make install 安装:

yoyo@yoyo:~/360Downloads/paho.mqtt.c-1.3.14/build$ make install
[ 24%] Built target common_obj
[ 27%] Built target paho-mqtt3a
[ 30%] Built target paho-mqtt3c
[ 32%] Built target MQTTVersion
[ 56%] Built target common_ssl_obj
[ 60%] Built target paho-mqtt3cs
[ 63%] Built target paho-mqtt3as
[ 66%] Built target thread
[ 68%] Built target test1
[ 70%] Built target test15
[ 73%] Built target test2
[ 75%] Built target test3
[ 77%] Built target test4
[ 78%] Built target test45
[ 80%] Built target test5
[ 82%] Built target test6
[ 84%] Built target test8
[ 87%] Built target test9
[ 89%] Built target test95
[ 91%] Built target test10
[ 93%] Built target test11
[ 95%] Built target test_issue373
[ 97%] Built target test_sync_session_present
[100%] Built target test_connect_destroy
Install the project...
-- Install configuration: "Release"
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/MQTTAsync_publish.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/MQTTAsync_publish_time.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/MQTTAsync_subscribe.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/MQTTClient_publish.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/MQTTClient_publish_async.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/MQTTClient_subscribe.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/paho_c_pub.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/paho_c_sub.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/paho_cs_pub.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/paho_cs_sub.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/samples/pubsub_opts.c
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/CONTRIBUTING.md
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/epl-v20
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/edl-v10
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/README.md
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/share/doc/Eclipse Paho C/notice.html
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3c.so.1.3.14
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3c.so.1
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3c.so
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3a.so.1.3.14
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3a.so.1
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3a.so
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/bin/MQTTVersion
-- Set non-toolchain portion of runtime path of "/path/to/paho.mqtt.c-1.3.14/arm_install/bin/MQTTVersion" to ""
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/include/MQTTAsync.h
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/include/MQTTClient.h
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/include/MQTTClientPersistence.h
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/include/MQTTProperties.h
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/include/MQTTReasonCodes.h
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/include/MQTTSubscribeOpts.h
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/include/MQTTExportDeclarations.h
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3cs.so.1.3.14
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3cs.so.1
-- Set non-toolchain portion of runtime path of "/path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3cs.so.1.3.14" to ""
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3cs.so
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3as.so.1.3.14
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3as.so.1
-- Set non-toolchain portion of runtime path of "/path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3as.so.1.3.14" to ""
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/libpaho-mqtt3as.so
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/cmake/eclipse-paho-mqtt-c/eclipse-paho-mqtt-cConfig.cmake
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/cmake/eclipse-paho-mqtt-c/eclipse-paho-mqtt-cConfig-release.cmake
-- Installing: /path/to/paho.mqtt.c-1.3.14/arm_install/lib/cmake/eclipse-paho-mqtt-c/eclipse-paho-mqtt-cConfigVersion.cmake

3. 移植到开发板

cp -arf /path/to/paho.mqtt.cpp/arm_install/lib/ /usr/paho.mqtt.cpp/

4. 简单示例

4.1 订阅——MQTTAsync_subscribe.c

这是使用了 libpaho-mqtt3a.so 进行订阅消息的源码,源码路径在源码的这个路径:paho.mqtt.c-1.3.14/src/samples/MQTTAsync_subscribe.c,只更改了服务器地址。完整代码如下:

/******************************************************************************** Copyright (c) 2012, 2022 IBM Corp., Ian Craggs** All rights reserved. This program and the accompanying materials* are made available under the terms of the Eclipse Public License v2.0* and Eclipse Distribution License v1.0 which accompany this distribution. ** The Eclipse Public License is available at *   https://www.eclipse.org/legal/epl-2.0/* and the Eclipse Distribution License is available at *   http://www.eclipse.org/org/documents/edl-v10.php.** Contributors:*    Ian Craggs - initial contribution*******************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTAsync.h"#if !defined(_WIN32)
#include <unistd.h>
#else
#include <windows.h>
#endif#if defined(_WRS_KERNEL)
#include <OsWrapper.h>
#endif#define ADDRESS     "192.168.33.1:1883"
//#define ADDRESS     "tcp://mqtt.eclipseprojects.io:1883"
#define CLIENTID    "ExampleClientSub"
#define TOPIC       "MQTT Examples"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000Lint disc_finished = 0;
int subscribed = 0;
int finished = 0;void onConnect(void* context, MQTTAsync_successData* response);
void onConnectFailure(void* context, MQTTAsync_failureData* response);void connlost(void *context, char *cause)
{MQTTAsync client = (MQTTAsync)context;MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;int rc;printf("\nConnection lost\n");if (cause)printf("     cause: %s\n", cause);printf("Reconnecting\n");conn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;conn_opts.onSuccess = onConnect;conn_opts.onFailure = onConnectFailure;if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS){printf("Failed to start connect, return code %d\n", rc);finished = 1;}
}int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_message *message)
{printf("Message arrived\n");printf("     topic: %s\n", topicName);printf("   message: %.*s\n", message->payloadlen, (char*)message->payload);MQTTAsync_freeMessage(&message);MQTTAsync_free(topicName);return 1;
}void onDisconnectFailure(void* context, MQTTAsync_failureData* response)
{printf("Disconnect failed, rc %d\n", response->code);disc_finished = 1;
}void onDisconnect(void* context, MQTTAsync_successData* response)
{printf("Successful disconnection\n");disc_finished = 1;
}void onSubscribe(void* context, MQTTAsync_successData* response)
{printf("Subscribe succeeded\n");subscribed = 1;
}void onSubscribeFailure(void* context, MQTTAsync_failureData* response)
{printf("Subscribe failed, rc %d\n", response->code);finished = 1;
}void onConnectFailure(void* context, MQTTAsync_failureData* response)
{printf("Connect failed, rc %d\n", response->code);finished = 1;
}void onConnect(void* context, MQTTAsync_successData* response)
{MQTTAsync client = (MQTTAsync)context;MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;int rc;printf("Successful connection\n");printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n""Press Q<Enter> to quit\n\n", TOPIC, CLIENTID, QOS);opts.onSuccess = onSubscribe;opts.onFailure = onSubscribeFailure;opts.context = client;if ((rc = MQTTAsync_subscribe(client, TOPIC, QOS, &opts)) != MQTTASYNC_SUCCESS){printf("Failed to start subscribe, return code %d\n", rc);finished = 1;}
}int main(int argc, char* argv[])
{MQTTAsync client;MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;MQTTAsync_disconnectOptions disc_opts = MQTTAsync_disconnectOptions_initializer;int rc;int ch;const char* uri = (argc > 1) ? argv[1] : ADDRESS;printf("Using server at %s\n", uri);if ((rc = MQTTAsync_create(&client, uri, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL))!= MQTTASYNC_SUCCESS){printf("Failed to create client, return code %d\n", rc);rc = EXIT_FAILURE;goto exit;}if ((rc = MQTTAsync_setCallbacks(client, client, connlost, msgarrvd, NULL)) != MQTTASYNC_SUCCESS){printf("Failed to set callbacks, return code %d\n", rc);rc = EXIT_FAILURE;goto destroy_exit;}conn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;conn_opts.onSuccess = onConnect;conn_opts.onFailure = onConnectFailure;conn_opts.context = client;if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS){printf("Failed to start connect, return code %d\n", rc);rc = EXIT_FAILURE;goto destroy_exit;}while (!subscribed && !finished)#if defined(_WIN32)Sleep(100);#elseusleep(10000L);#endifif (finished)goto exit;do {ch = getchar();} while (ch!='Q' && ch != 'q');disc_opts.onSuccess = onDisconnect;disc_opts.onFailure = onDisconnectFailure;if ((rc = MQTTAsync_disconnect(client, &disc_opts)) != MQTTASYNC_SUCCESS){printf("Failed to start disconnect, return code %d\n", rc);rc = EXIT_FAILURE;goto destroy_exit;}while (!disc_finished){#if defined(_WIN32)Sleep(100);#elseusleep(10000L);#endif}destroy_exit:MQTTAsync_destroy(&client);
exit:return rc;
}

交叉编译:

arm-linux-gnueabihf-gcc MQTTAsync_subscribe.c -I /path/to/paho.mqtt.c-1.3.14/arm_install/include/ -L /path/to/paho.mqtt.c-1.3.14/arm_install/lib/ -l paho-mqtt3a -o MQTTAsync_subscribe

在arm开发板中运行:

/customer/mqtt_test # Using server at 192.168.33.1:1883
Successful connection
Subscribing to topic MQTT Examples
for client ExampleClientSub using QoS1Press Q<Enter> to quitSubscribe succeeded

4.2 发布——MQTTAsync_publish.c

这是使用了 libpaho-mqtt3a.so 进行发布消息的源码,源码路径在源码的这个路径:paho.mqtt.c-1.3.14/src/samples/MQTTAsync_publish.c,只更改了服务器地址。完整代码如下:

/******************************************************************************** Copyright (c) 2012, 2023 IBM Corp., Ian Craggs** All rights reserved. This program and the accompanying materials* are made available under the terms of the Eclipse Public License v2.0* and Eclipse Distribution License v1.0 which accompany this distribution. ** The Eclipse Public License is available at *   https://www.eclipse.org/legal/epl-2.0/* and the Eclipse Distribution License is available at *   http://www.eclipse.org/org/documents/edl-v10.php.** Contributors:*    Ian Craggs - initial contribution*******************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTAsync.h"#if !defined(_WIN32)
#include <unistd.h>
#else
#include <windows.h>
#endif#if defined(_WRS_KERNEL)
#include <OsWrapper.h>
#endif#define ADDRESS     "192.168.33.1:1883"
//#define ADDRESS     "tcp://mqtt.eclipseprojects.io:1883"
#define CLIENTID    "ExampleClientPub"
#define TOPIC       "MQTT Examples"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000Lint finished = 0;void connlost(void *context, char *cause)
{MQTTAsync client = (MQTTAsync)context;MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;int rc;printf("\nConnection lost\n");if (cause)printf("     cause: %s\n", cause);printf("Reconnecting\n");conn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS){printf("Failed to start connect, return code %d\n", rc);finished = 1;}
}void onDisconnectFailure(void* context, MQTTAsync_failureData* response)
{printf("Disconnect failed\n");finished = 1;
}void onDisconnect(void* context, MQTTAsync_successData* response)
{printf("Successful disconnection\n");finished = 1;
}void onSendFailure(void* context, MQTTAsync_failureData* response)
{MQTTAsync client = (MQTTAsync)context;MQTTAsync_disconnectOptions opts = MQTTAsync_disconnectOptions_initializer;int rc;printf("Message send failed token %d error code %d\n", response->token, response->code);opts.onSuccess = onDisconnect;opts.onFailure = onDisconnectFailure;opts.context = client;if ((rc = MQTTAsync_disconnect(client, &opts)) != MQTTASYNC_SUCCESS){printf("Failed to start disconnect, return code %d\n", rc);exit(EXIT_FAILURE);}
}void onSend(void* context, MQTTAsync_successData* response)
{MQTTAsync client = (MQTTAsync)context;MQTTAsync_disconnectOptions opts = MQTTAsync_disconnectOptions_initializer;int rc;printf("Message with token value %d delivery confirmed\n", response->token);opts.onSuccess = onDisconnect;opts.onFailure = onDisconnectFailure;opts.context = client;if ((rc = MQTTAsync_disconnect(client, &opts)) != MQTTASYNC_SUCCESS){printf("Failed to start disconnect, return code %d\n", rc);exit(EXIT_FAILURE);}
}void onConnectFailure(void* context, MQTTAsync_failureData* response)
{printf("Connect failed, rc %d\n", response ? response->code : 0);finished = 1;
}void onConnect(void* context, MQTTAsync_successData* response)
{MQTTAsync client = (MQTTAsync)context;MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;MQTTAsync_message pubmsg = MQTTAsync_message_initializer;int rc;printf("Successful connection\n");opts.onSuccess = onSend;opts.onFailure = onSendFailure;opts.context = client;pubmsg.payload = PAYLOAD;pubmsg.payloadlen = (int)strlen(PAYLOAD);pubmsg.qos = QOS;pubmsg.retained = 0;if ((rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, &opts)) != MQTTASYNC_SUCCESS){printf("Failed to start sendMessage, return code %d\n", rc);exit(EXIT_FAILURE);}
}int messageArrived(void* context, char* topicName, int topicLen, MQTTAsync_message* m)
{/* not expecting any messages */return 1;
}int main(int argc, char* argv[])
{MQTTAsync client;MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;int rc;const char* uri = (argc > 1) ? argv[1] : ADDRESS;printf("Using server at %s\n", uri);if ((rc = MQTTAsync_create(&client, uri, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTASYNC_SUCCESS){printf("Failed to create client object, return code %d\n", rc);exit(EXIT_FAILURE);}if ((rc = MQTTAsync_setCallbacks(client, client, connlost, messageArrived, NULL)) != MQTTASYNC_SUCCESS){printf("Failed to set callback, return code %d\n", rc);exit(EXIT_FAILURE);}conn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;conn_opts.onSuccess = onConnect;conn_opts.onFailure = onConnectFailure;conn_opts.context = client;if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS){printf("Failed to start connect, return code %d\n", rc);exit(EXIT_FAILURE);}printf("Waiting for publication of %s\n""on topic %s for client with ClientID: %s\n",PAYLOAD, TOPIC, CLIENTID);while (!finished)#if defined(_WIN32)Sleep(100);#elseusleep(10000L);#endifMQTTAsync_destroy(&client);return rc;
}

交叉编译:

arm-linux-gnueabihf-gcc MQTTAsync_publish.c -I /path/to/paho.mqtt.c-1.3.14/arm_install/include/ -L /path/to/paho.mqtt.c-1.3.14/arm_install/lib/ -l paho-mqtt3a -o MQTTAsync_publish

在arm开发板中运行:

/customer/mqtt_test # ./MQTTAsync_publish
Using server at 192.168.33.1:1883
Waiting for publication of Hello World!
on topic MQTT Examples for client with ClientID: ExampleClientPub
Successful connection
Message with token value 1 delivery confirmed
Successful disconnection

五、FAQ

Q:install TARGETS given target "paho-mqtt3a" which does not exist.

CMake error while compiling paho.mqtt.cpp · Issue #493 · eclipse-paho/paho.mqtt.cpp

-- Paho C: Bundled
CMake Error at CMakeLists.txt:75 (add_subdirectory):The source directory/path/to/paho.mqtt.cpp-1.5.2/externals/paho-mqtt-cdoes not contain a CMakeLists.txt file.CMake Error at CMakeLists.txt:79 (add_library):add_library cannot create ALIAS target "eclipse-paho-mqtt-c::paho-mqtt3a"because target "paho-mqtt3a" does not already exist.CMake Error at CMakeLists.txt:82 (add_library):add_library cannot create ALIAS target "eclipse-paho-mqtt-c::paho-mqtt3as"because target "paho-mqtt3as" does not already exist.CMake Error at CMakeLists.txt:97 (install):install TARGETS given target "paho-mqtt3a" which does not exist.

错误原因:没有下载 externals/paho-mqtt-c

解决方法:手动下载对应版本的 paho-mqtt-c

git clone https://github.com/eclipse-paho/paho.mqtt.c.git
mv paho.mqtt.c paho-mqtt-c
yoyo@yoyo:~/360Downloads/paho.mqtt.cpp-1.5.2$ tree -L 2 ./externals/
./externals/
└── paho-mqtt-c├── about.html├── android├── appveyor.yml├── build.xml├── cbuild.bat├── cmake├── cmake-build.sh├── CMakeLists.txt├── CODE_OF_CONDUCT.md├── CONTRIBUTING.md├── deploy_rsa.enc├── dist├── doc├── docs├── edl-v10├── epl-v20├── LICENSE├── Makefile├── NOTICE├── notice.html├── PULL_REQUEST_TEMPLATE.md├── README.md├── SECURITY.md├── src├── test├── test_package├── version.major├── version.minor└── version.patch

Q:libanl.so.1: cannot open shared object file: No such file or directory

./async_publish: error while loading shared libraries: libanl.so.1: cannot open shared object file: No such file or directory

错误原因:缺少libanl.so库。

解决方法

(1)在宿主机中查找 libanl.so(通常在交叉编译工具链的lib目录中)。

find / -name "libanl.so.1" 2>/dev/null
yoyo@yoyo:/media/sda3/share/tftpboot/mqtt_test$ find / -name "libanl.so*" 2>/dev/null
/path/to/toolchains/arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/libanl.so.1
/path/to/toolchains/arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/libanl.so
yoyo@yoyo:/media/sda3/share/tftpboot/mqtt_test$ ll /path/to/toolchains/arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/libanl.so.1
lrwxrwxrwx 1 yoyo yoyo 14 Jun  8  2021 /path/to/toolchains/arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/libanl.so.1 -> libanl-2.33.so*

由此可见,libanl.so.1 是指向 libanl-2.33.so 的软链接。

(2)将 libanl-2.33.so 拷贝到arm开发板中,并创建软链接。

# 拷贝到arm开发板中
scp /path/to/toolchains/arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/libanl-2.33.so /lib/# 创建软链接
ln /lib/libanl-2.33.so /lib/libanl.so.1

Q:Connection attempt failed

/customer/mqtt_test # ./async_subscribe
Connecting to the MQTT server '192.168.33.1:1883'...Connection attempt failed
Connection attempt failed
Connection attempt failed
Connection attempt failed

错误原因:服务端mosquitto未启动。

解决方法:启动mosquitto服务端。

mosquitto -v -c /etc/mosquitto/mosquitto.conf# 后台启动
mosquitto -v -c /etc/mosquitto/mosquitto.conf -d

Q:MQTT error [-1]: TCP/TLS connect failure

/customer/mqtt_test # ./async_publish
Initializing for server '192.168.33.1:1883'......OKConnecting...
Waiting for the connection...
MQTT error [-1]: TCP/TLS connect failure

解决方法,同【Connection attempt failed】。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink 源码编译

打包命令 打包整个项目 mvn clean package -DskipTests -Drat.skiptrue打包单个模块 mvn clean package -DskipTests -Drat.skiptrue -pl flink-dist如果该模块依赖其他模块&#xff0c;可能需要先将其他模块 install 到本地&#xff0c;如果依赖的模块的源代码有修改&#…

【Agent实战】从0到1开发一个Python 解释器 MCP SSE Server

写在前面 想象一个场景:LLM Agent(如 AutoGPT、MetaGPT 或我们自己构建的 Agent)在规划任务后,决定需要运行一段 Python 代码来处理数据或调用某个 API。它不能直接在自己的环境中执行(通常不具备这个能力,也不安全),而是需要将这段代码发送给一个专门的外部服务来执行…

HTML word属性

介绍 CSS word-spacing 属性&#xff0c;用于指定段字之间的空间&#xff0c;例如&#xff1a; p {word-spacing:30px; }word-spacing属性增加或减少字与字之间的空白。 注意&#xff1a; 负值是允许的。 浏览器支持 表格中的数字表示支持该属性的第一个浏览器版本号。 属…

assertEquals()

assertEquals() 是 JUnit 框架中用于进行断言操作的一个非常常用的方法&#xff0c;其主要目的是验证两个值是否相等。如果两个值不相等&#xff0c;测试就会失败&#xff0c;JUnit 会给出相应的错误信息&#xff0c;提示开发者测试未通过。下面为你详细介绍&#xff1a; 方法…

Nginx 反向代理,啥是“反向代理“啊,为啥叫“反向“代理?而不叫“正向”代理?它能干哈?

Nginx 反向代理的理解与配置 User 我打包了我的前端vue项目&#xff0c;上传到服务器&#xff0c;在宝塔面板安装了nginx服务&#xff0c;配置了文件 nginx.txt .运行了项目。 我想清楚&#xff0c;什么是nginx反向代理&#xff1f;是nginx作为一个中介&#xff1f;中间件来集…

用 Python 打造打篮球字符动画!控制台彩色炫酷输出,抖音搞怪视频灵感还原

一、引言&#xff1a;从抖音搞怪视频到 Python 字符动画的奇妙之旅 刷抖音时刷到一个神级操作 —— 博主用 01 数字矩阵还原了明星打篮球的经典画面&#xff0c;字符在控制台随动作节奏炫彩跳动&#xff0c;瞬间点燃了技术宅的 DNA&#xff01;作为 Python 图像处理爱好者&…

《逐梦九天:中国航天编年史》

《逐梦九天:中国航天编年史》 新华社酒泉2025年4月24日电(记者李国利、黄一宸)神舟二十号载人飞船发射4月24日取得圆满成功,中国载人航天在“东方红一号”发射55载之际开启第20次神舟问天之旅。 当日17时17分,搭载神舟二十号载人飞船的长征二号F遥二十运载火箭在酒泉卫星…

IDEA搭建环境的五种方式

一、普通的java项目 File--New--Project 选择Java&#xff0c;jdk选择1.8版本&#xff0c;然后点next 输入项目名和路径名&#xff0c;点击Finish 创建包结构&#xff0c;编写Class类 编写主方法&#xff0c;输出Hello标志完成 二、普通的javaWeb项目 Java Enterprise-- 勾选…

【黑马 微服务面试篇】

分布式事务 cap定理-Availability CAP定理-Partition tolerance BASE理论 BASE理论是对CAP的一种解决思路&#xff0c;包含三个思想&#xff1a; BasicallyAvailable&#xff08;基本可用&#xff09;&#xff1a;分布式系统在出现故障时&#xff0c;允许损失部分可用性&#…

实时数仓体系概览与架构演进

✨ 引言&#xff1a;为什么我们离不开“实时” 曾经的你可能会认为“数据分析一天一更&#xff0c;够用了”。但当你所在的公司遇上这些情况&#xff1a; 用户在投放广告后5分钟内就想知道转化效果 风控平台必须秒级判断是否拦截订单 新产品上线后一小时就需调整推荐算法策略…

基于Matlab的车牌识别系统

1.程序简介 本模型基于MATLAB,通过编程创建GUI界面&#xff0c;基于Matlab的数字图像处理&#xff0c;对静止的车牌图像进行分割并识别&#xff0c;通过编写matlab程序对图像进行灰度处理、二值化、腐蚀膨胀和边缘化处理等&#xff0c;并定位车牌的文字&#xff0c;实现字符的…

JAVA---面向对象(下)

重生之我开始补知识第三集 1.标准 JavaBean 要求&#xff1a; 1&#xff09;类名需要见名知意 2&#xff09;成员变量使用private修饰 3&#xff09;至少提供两个构造方法 a.无参构造方法 b.带全部参数的构造方法 4&#xff09;成员方法 a.提供每一个成员变量对应的 …

信奥赛CSP-J复赛集训(DP专题)(24):P1977 出租车拼车

信奥赛CSP-J复赛集训&#xff08;DP专题&#xff09;&#xff08;24&#xff09;&#xff1a;P1977 出租车拼车 题目背景 话说小 x 有一次去参加比赛&#xff0c;虽然学校离比赛地点不太远&#xff0c;但小 x 还是想坐出租车去。大学城的出租车总是比较另类&#xff0c;有“拼…

Windows申请苹果开发者测试证书Uniapp使用

注意事项 苹果设备,最好是iPhone XS以上,要不然下载不了Apple DeveloperopenSSL 要是V1版本的来生成证书,要不然HBuilder报错按步骤来,生成证书,生成标识符,添加测试设备,生成描述性文件注册苹果开发者账号 (如果有苹果账号直接登录) 苹果开发者官网 开通付费 点击右上…

dockercompose文件仓库

mysql version: 3 # 使用docker-compose的版本&#xff0c;根据需要可以调整# 创建数据目录 # mkdir -p /home/docker/mysql/mysql_data # mkdir -p /home/docker/mysql/mysql_logs # 给予适当的权限&#xff08;确保MySQL容器可以读写这些目录&#xff09; # chmod 777 /ho…

【Linux】47.高级IO(1)

文章目录 1. 高级IO1.1 五种IO模型1.2 高级IO重要概念1.2.1 同步通信 vs 异步通信1.2.2 阻塞 vs 非阻塞 1.3非阻塞IO1.3.1 fcntl1.3.2 实现函数SetNoBlock1.3.3 轮询方式读取标准输入1.3.4 I/O多路转接之select1.3.4.1 初识select&#xff1a;1.3.4.2 select函数原型1.3.4.3 理…

【Vulkan 入门系列】创建帧缓冲、命令池、命令缓存,和获取图片(六)

这一节主要介绍创建帧缓冲&#xff08;Framebuffer&#xff09;&#xff0c;创建命令池&#xff0c;创建命令缓存&#xff0c;和从文件加载 PNG 图像数据&#xff0c;解码为 RGBA 格式&#xff0c;并将像素数据暂存到 Vulkan 的 暂存缓冲区中。 一、创建帧缓冲 createFramebu…

ubuntu的普通用户相关配置

1.切换到普通用户下&#xff0c;不出现&#xff0c;用户名主机ip, 环境变量被破坏&#xff0c; 参考&#xff1a;一文教你快速修改ubuntu终端显示的主机名和用户名_ubuntu终端名称-CSDN博客 2.如果登陆进去无法使用ls,cd&#xff0c;vi等命令 2.1 环境变量 如果 PATH 被清空…

腾讯云×数语科技:Datablau DDM (AI智能版)上架云应用!

在数据爆炸式增长的时代&#xff0c;传统的数据建模方式已难以满足企业对敏捷性、智能化、自动化的需求。数语科技联合腾讯云推出的 Datablau DDM 数据建模平台&#xff08;AI智能版&#xff09;&#xff0c;基于AI语义建模技术&#xff0c;深度融合腾讯混元大模型能力&#xf…

Spark-streaming(一)

Spark-Streaming概述 Spark Streaming 用于流式数据的处理。 和 Spark 基于 RDD 的概念很相似&#xff0c;Spark Streaming 使用离散化流(discretized stream)作为抽象表示&#xff0c;叫作 DStream。 DStream 是随时间推移而收到的数据的序列。 Spark-Streaming的特点&…