本项目是在i.mx6u上移植mqtt协议
记录一下在移植mqtt协议时出现的问题和解决方法:
首先在按照正点原子的教程编译MQTT时出现问题,原因是Makefile写的有问题,openssl库在交叉编译的时候出现问题,目前原因还不是很清楚,参考其它大神的解决办法,问题得到解决。
一.下载并交叉编译openssl
1.1 下载openssl
openssl官网
https://www.openssl.org/source/
创建新的文件夹openssl_arm保存源码,并在此文件夹路径下创建安装目录ssl_arm
1.2 配置源文件生成Makefile
sudo ./config no-async no-asm shared --prefix=/home/yzj/tools/openssl_arm/ssl_arm --cross-compile-prefix=arm-linux-gnueabihf-
命令中的路径改成自己的路径
执行成功后会在目录下创建Makefile文件
1.3 修改Makefile
进入openssl-1.1.1s,修改此目录下的makefile
可以用vim命令打开,这里我直接用vscode打开方便修改
1.删除Makefile文件中的-m64
在vscode中Ctrl+F搜索-m64并删除,有的版本makefile中需要查看编译器是否为arm-linux-gnueabihf- 不是的话要一一修改如gcc、ar、g++等等
2.编译生成相关库
make&&make install
编译安装完成后ssl_arm目录如下,即完成openssl交叉编译
二.交叉编译移植paho.mqttd
1.1 下载paho.mqtt.c-1.3.0源码
paho mqtt 官网地址:https://github.com/eclipse/paho.mqtt.c/releases
我下载的是1.3.0版本,大家自己看情况,尽量跟我一致。
1.2 修改Makefile
1.下载解压完成后,在paho.mqtt.c-1.3.0文件夹下,创建如下文件夹
2.创建完成后修改Makefile,如下
修改为指定路径build/install/local
3.指定交叉编译工具链
CC = /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
4.添加ssl库路径
CCFLAGS_SO += -I /home/yzj/tools/openssl_arm/ssl_arm/include
LDFLAGS_C += -L /home/yzj/tools/openssl_arm/ssl_arm/lib
LDFLAGS_CS += -L /home/yzj/tools/openssl_arm/ssl_arm/lib
LDFLAGS_A += -L /home/yzj/tools/openssl_arm/ssl_arm/lib
LDFLAGS_AS += -L /home/yzj/tools/openssl_arm/ssl_arm/lib
FLAGS_EXE += -L /home/yzj/tools/openssl_arm/ssl_arm/lib
FLAGS_EXES += -L /home/yzj/tools/openssl_arm/ssl_arm/lib
注意:路径需要按照自己的路径进行修改
上面为我的路径。
5.修改install和uninstall
install:
install: build
mkdir -p $(DESTDIR)$(PREFIX)${includedir}
mkdir -p $(DESTDIR)$(PREFIX)${libdir}
mkdir -p $(DESTDIR)$(PREFIX)${bindir}
mkdir -p $(DESTDIR)${man1dir}
mkdir -p $(DESTDIR)${man3dir}
cp -f ${MQTTLIB_C_TARGET} $(DESTDIR)${libdir}
cp -f ${MQTTLIB_CS_TARGET} $(DESTDIR)${libdir}
cp -f ${MQTTLIB_A_TARGET} $(DESTDIR)${libdir}
cp -f ${MQTTLIB_AS_TARGET} $(DESTDIR)${libdir}
cp -f ${MQTTVERSION_TARGET} $(DESTDIR)${bindir}
cp -f ${PAHO_C_PUB_TARGET} $(DESTDIR)${bindir}
cp -f ${PAHO_C_SUB_TARGET} $(DESTDIR)${bindir}
cp -f ${PAHO_CS_PUB_TARGET} $(DESTDIR)${bindir}
cp -f ${PAHO_CS_SUB_TARGET} $(DESTDIR)${bindir}
ln -sf lib$(MQTTLIBC).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_C).so
ln -sf lib$(MQTTLIB_CS).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_CS).so
ln -sf lib$(MQTTLIB_A).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_A).so
ln -sf lib$(MQTTLIB_AS).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_AS).so
ln -sf lib$(MQTTLIB_C).so.${VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_C).so.${MAJOR_VERSION}
ln -sf lib$(MQTTLIB_CS).so.${VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_CS).so.${MAJOR_VERSION}
ln -sf lib$(MQTTLIB_A).so.${VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_A).so.${MAJOR_VERSION}
ln -sf lib$(MQTTLIB_AS).so.${VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_AS).so.${MAJOR_VERSION}
cp -f ${srcdir}/MQTTAsync.h $(DESTDIR)${includedir}
cp -f ${srcdir}/MQTTClient.h $(DESTDIR)${includedir}
cp -f ${srcdir}/MQTTClientPersistence.h $(DESTDIR)${includedir}
cp -f ${srcdir}/MQTTProperties.h $(DESTDIR)${includedir}
cp -f ${srcdir}/MQTTReasonCodes.h $(DESTDIR)${includedir}
cp -f ${srcdir}/MQTTSubscribeOpts.h $(DESTDIR)${includedir}
- cp -f doc/man/man1/paho_c_pub.1 $(DESTDIR)${man1dir}
- cp -f doc/man/man1/paho_c_sub.1 $(DESTDIR)${man1dir}
- cp -f doc/man/man1/paho_cs_pub.1 $(DESTDIR)${man1dir}
- cp -f doc/man/man1/paho_cs_sub.1 $(DESTDIR)${man1dir}
- cp -f ${blddir}/doc/MQTTClient/man/man3/MQTTClient.h.3 $(DESTDIR)${man3dir}
- cp -f ${blddir}/doc/MQTTAsync/man/man3/MQTTAsync.h.3 $(DESTDIR)${man3dir}
@echo “”
@echo “make install finish”, 'date'
@echo “”
uninstall:
uninstall:
rm -rf $(blddir_work)
@echo “”
@echo “make uninstall finish”, 'date'
@echo “”
1.3 编译
修改完成后make &&make install 生成库
重点来了,当在执行上述命令后如果出现以下错误:
查看build路径,发现没有生成doc文件夹,需要运行 make html 生成,运行 make html 时,报错误 /bin/sh: 1: doxygen: not found,没有安装doxygen,参考这篇文章:https://blog.csdn.net/yamida/article/details/79428515
安装完成后:sudo make uninstall 去掉前面有错的安装,再make html,没有报错后,再sudo make install 重新安装。如下:
接下来就是打包,移植的i.max6ull上啦,总的来说还是遇到各种各样的问题,但是稍微花点时间还是解决啦。