概述
为了防止后来人走弯路本人综合网上的各路教程,统计出一个自己成功方便的路径,以便给其他有需求的人一些参考
一开始是因为工作需求需要移植mqtt协议到嵌入式arm-linux上,使用的phao的mqtt支持包,一开始看到phao官网上的说明,便选择embbed的嵌入式版本,但是嵌入式版本是不支持ssl的,可能是官网描写有误,所以,要支持ssl,必须选择标准的c版本进行交叉编译。
第一步
- 首先标准的c版本是需要OpenSSL的支持,我们先从 OpenSSL的官网 下载OpenSSL的最新版本 openssl-1.1.1-pre8.tar.gz
- 然后从github上下载zip包
- 在方便位置新建文件夹为template(推荐在主目录)
mkdir ./template
-
将openssl-1.1.1-pre8.tar.gz和paho.mqtt.c-master.zip都放到template文件夹下备用
第二步
- 首先将OpenSSL和paho.mqtt.c解压到当前目录
cd ./template
tar -xzvf openssl-1.1.1-pre8.tar.gz
unzip paho.mqtt.c-master.zip
解压之后的情况应该是这样
- 先将OpenSSL进行交叉编译,这里我们需要修改Makefile
先执行
./config no-asm -shared --prefix=/home/dai/template/ssl-arm
perfix是为了把编译完成的文件存放在template下的ssl-arm目录下,需要使用绝对地址,如果像改变存放地址,可以自己进行修改,
gedit ./openssl-1.1.1-pre8/Makefile
ubuntu推荐使用图形文本编辑器,如果是其他linux也可以使用vi编辑器
定位到90行将
CROSS_COMPILE=
改为
CROSS_COMPILE=arm-linux-
交叉编译工具实际由你的目标板来定
顺便将123和124行的-m64删除,我们这里不需要用到64编译
然后保存并关闭,
接下来执行
make -j3
如果出现错误
crypto/threads_pthread.c: In function `CRYPTO_THREAD_lock_new':
crypto/threads_pthread.c:43: warning: implicit declaration of function `pthread_mutexattr_settype'
crypto/threads_pthread.c:43: error: `PTHREAD_MUTEX_RECURSIVE' undeclared (first use in this function)
crypto/threads_pthread.c:43: error: (Each undeclared identifier is reported only once
crypto/threads_pthread.c:43: error: for each function it appears in.)
Makefile:5122: recipe for target 'crypto/threads_pthread.o' failed
make[1]: *** [crypto/threads_pthread.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make[1]: Leaving directory '/home/dai/template/openssl-1.1.1-pre8'
Makefile:171: recipe for target 'all' failed
make: *** [all] Error 2
打开crypro目录下的threads_pthread.c,在18行添加一句
#define PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP
即可,这是因为有些linux版本没有定义此变量造成的但是两者意义相同。
接着再执行
make install
就可以在ssl-arm文件下看到这些
到现在为止的话,OpenSSL的编译算是告一段落了
第三部
编译paho.mqtt.c
- 打开paho.mqtt.c-master下的makefile文件
在第129行添加
CFLAGS += -I../ssl-arm/include -lrt
LDFLAGS += -L../ssl-arm/lib
为ssl编译出来的路径,如有自行修改,便自行修改
接下来执行
make -j3 CC=arm-linux-gcc
接下来就大功告成了,只要在build文件找到动态库就可以了,当然,simple里的例程也可以测试运行以下。