MQTT+SSL编译
1.背景
物联网开发,需要与移动ONENET平台对接,涉及到MQTT+SSL通信。在网上下载了Eclipse的PAHO MQTT代码和openssl源码。下面讲述编译过程和遇到的一些坑。
2.OPENSSL编译
OpenSSL的源码网上很多,如
官网地址: https://www.openssl.org/
github下载:https://github.com/openssl/openssl
本人用的是openssl-1.1.1g.tar.gz,下载下来后解压,输入指令:
./config -shared no-asm --prefix=$PWD/build -fPIC --cross-compile-prefix=arm-xxx
注:
–prefix 表示自定义安装路径
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的;
-shared 生成动态库
no-asm 表示:Do not use assembler code。
–cross-compile-prefix 表示指定交叉编译器,需要提前安装配置好自己需要的交叉编译器
通过config生成Makefile文件后,输入:
make
make install
在指定的目录下可以看到生成的库文件:
3.PAHO MQTT编译
接下来进行MQTT编译,PAHO MQTT源码官网下载路径:
http://www.eclipse.org/paho/
github下载:
https://github.com/eclipse/paho.mqtt.c
解压后,在paho.mqtt.c目录下创建build文件夹,在build文件夹创建ssllib,将openssl生成的lib,include等copy到ssllib中,方便管理:
回到paho.mqtt.c目录下,输入:
cmake -DPAHO_WITH_SSL=TRUE -DPAHO_BUILD_STATIC=TRUE -DOPENSSL_INCLUDE_DIR=$PWD/build/ssllib/include -DOPENSSL_SSL_LIBRARY=$PWD/build/ssllib/lib/libssl.so -DOPENSSL_CRYPTO_LIBRARY=$PWD/build/ssllib/lib/libcrypto.so .
注意最后有“ .”,表示CMakeLists.txt在当前路径.
输出文件为CMakeCache.txt,如果需要交叉编译再加上-DCMAKE_C_COMPILER=arm-xxx即可。可以查看该文件的内容确认参数是否修改正确.
接着输入:
make
make成功如上图:
接着make install
libpaho-mqtt3as.*和libpaho-mqtt3cs.*即是支持ssl的mqtt库
3.编译过程问题汇总
问题1.mqtt在make时,报错/usr/bin/ld: cannot findssllib/lib/: File format not recognized:
cmake制作mqtt的Makefile时,一直以为-DOPENSSL_SSL_LIBRARY是lib路径,只填写到了$PWD/build/ssllib/lib,导致报错如下:
问题2.cmake编译时找了不少网上资料,提供了各种参数配置,有些参数其实不对,可以通过CMakeCache.txt查看参数是否正确:
错误的参数会提示no help,表示无效
问题3.编译出来的动态库找不到依赖库
这是因为我在编译mqtt库的时候重定义了SSL库位置,并不在默认路径下,需要编辑/etc/ld.so.conf,增加ssl库的位置:
编辑完后,输入ldconfig,重加载。
再次检查maqtt动态库: