先提前说下,这些库不同的版本可能有较大差异(本人使用的openssl版本是3.3.0,paho-mqtt-c版本是1.3.13),如果发现跟自己的环境不一致,请酌情参考。
- 下载源代码
有外网可以去github上下载,这里贴一个下载好的 paho-mqtt-c
- 在根目录下建一个build文件夹,切换到里面,再建一个install文件夹
bash
paho.mqtt.c$ mkdir build/install -p
paho.mqtt.c$ cd build/
paho.mqtt.c/build$
- 如果mqtt不需要SSL安全认证,可以直接执行(注意把编译工具链路径改成自己的),如果需要SSL认证,请跳6
bash
paho.mqtt.c/build$ cmake .. \
-DPAHO_WITH_SSL=OFF \
-DPAHO_BUILD_DOCUMENTATION=OFF \
-DPAHO_BUILD_SAMPLES=OFF \
-DPAHO_BUILD_STATIC=OFF \
-DPAHO_BUILD_SHARED=ON \
-DCMAKE_INSTALL_PREFIX=./install \
-DCMAKE_C_COMPILER=/path/to/cross_comiler_tool/bin/xxxxxx-xxxxxx-xxxx-xxx-gcc \
-DCMAKE_CXX_COMPILER=/path/to/cross_comiler_tool/bin/xxxxxx-xxxxxx-xxxx-xxx-gcc
- 然后执行make & make install
bash
paho.mqtt.c/build$ make & make install
- 查看文件
bash
paho.mqtt.c/build$ tree install -L 2
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.13
│ ├── libpaho-mqtt3a.so.1.3.13
│ ├── libpaho-mqtt3c.so -> libpaho-mqtt3c.so.1
│ ├── libpaho-mqtt3c.so.1 -> libpaho-mqtt3c.so.1.3.13
│ └── libpaho-mqtt3c.so.1.3.13
└── share
└── doc
6 directories, 14 files
- 如果需要SSL认证,则需要先编译openssl库,方法可参考:openssl交叉编译
编译完openssl后,我们需要把它的头文件和库文件路径指定给paho-mqtt-c,由于paho-mqtt-c的编译是cmake控制的,我们可以直接用openssl提供的cmake文件,它在opensll的install目录下:lib64/cmake/OpenSSL/OpenSSLConfig.cmake
按理说有了这个文件,我们可以直接在cmake中调用find_package()来完成加载,但本人在实际操作时遇到很多问题(可能是版本问题),下面是本人探索的解决方法(可能还有更好的,欢迎分享)
6.1 先修改OpenSSLConfig.cmake文件
bash
75 # Directories and names 修改前
76 #set(OPENSSL_INCLUDE_DIR "${_ossl_prefix}/include")
77 #set(OPENSSL_LIBRARY_DIR "${_ossl_prefix}/lib64")
78 #set(OPENSSL_ENGINES_DIR "${_ossl_prefix}/install/lib64/engines-3")
79 #set(OPENSSL_MODULES_DIR "${_ossl_prefix}/install/lib64/ossl-modules")
80 #set(OPENSSL_RUNTIME_DIR "${_ossl_prefix}/bin")
81 #修改后
82 set(OPENSSL_INCLUDE_DIR "${_ossl_prefix}/install/include")
83 set(OPENSSL_LIBRARY_DIR "${_ossl_prefix}/install/lib64")
84 set(OPENSSL_ENGINES_DIR "${_ossl_prefix}/install/lib64/engines-3")
85 set(OPENSSL_MODULES_DIR "${_ossl_prefix}/install/lib64/ossl-modules")
86 set(OPENSSL_RUNTIME_DIR "${_ossl_prefix}/install/bin")
6.2 修改paho-mqtt-c库中src/CMakeLists.txt(注意要改成自己的路径)
bash
194 #find_package(OpenSSL REQUIRED)
195 #注释上面这行,改为下面的
196 find_package(OpenSSL REQUIRED CONFIG PATHS "/path/to/openssl/install/lib64/cmake/OpenSSL")
6.3 执行cmake(注意路径都要改成自己的)
bash
paho.mqtt.c/build$ cmake .. \
-DPAHO_WITH_SSL=ON \
-DPAHO_BUILD_DOCUMENTATION=OFF \
-DPAHO_BUILD_SAMPLES=OFF \
-DPAHO_BUILD_STATIC=OFF \
-DPAHO_BUILD_SHARED=ON \
-DCMAKE_INSTALL_PREFIX=./install \
-DCMAKE_C_COMPILER=/path/to/cross_comiler_tool/bin/xxxxxx-xxxxxx-xxxx-xxx-gcc \
-DCMAKE_CXX_COMPILER=/path/to/cross_comiler_tool/bin/xxxxxx-xxxxxx-xxxx-xxx-g++ \
-DOpenSSL_DIR=/path/to/openssl/install/lib64/cmake/OpenSSL \
6.4 make & make install
bash
paho.mqtt.c/build$ make & make install
6.5 查看安装结果
bash
paho.mqtt.c/build$ tree install -L 2
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.13
│ ├── libpaho-mqtt3a.so.1.3.13
│ ├── libpaho-mqtt3as.so -> libpaho-mqtt3as.so.1
│ ├── libpaho-mqtt3as.so.1 -> libpaho-mqtt3as.so.1.3.13
│ ├── libpaho-mqtt3as.so.1.3.13
│ ├── libpaho-mqtt3c.so -> libpaho-mqtt3c.so.1
│ ├── libpaho-mqtt3c.so.1 -> libpaho-mqtt3c.so.1.3.13
│ ├── libpaho-mqtt3c.so.1.3.13
│ ├── libpaho-mqtt3cs.so -> libpaho-mqtt3cs.so.1
│ ├── libpaho-mqtt3cs.so.1 -> libpaho-mqtt3cs.so.1.3.13
│ └── libpaho-mqtt3cs.so.1.3.13
└── share
└── doc
6 directories, 20 files