Linux:MQTT通信协议之八 -- 交叉编译paho.mqtt.c

1、前言

前面第五篇文章已经交叉编译过mosquitto了,其实paho.mqtt.c也是类似编译的,都是需要先交叉编译OpenSSL库,然后在make编译的时候设置CFLAGS等变量来指定OpenSSL的头文件和库路径。


2、交叉编译步骤

2.1 交叉编译OpenSSL

源码下载https://www.openssl.org/source/old/

编译步骤

tar xzvf openssl-1.1.0k.tar.gz
cd openssl-1.1.0k/
mkdir tmp
./config shared no-asm --prefix=$PWD/tmp/
vi Makefile     # 修改内容如下
    CROSS_COMPILE=arm-linux-gnueabihf-
    # 重点 --> 由于我们的板子CPU是32位,所以需要去掉所有“-m64”选项
make
make install
ls -l tmp/      # 我们感兴趣的只有bin/include/lib三个路径
2.2 交叉编译paho.mqtt.c

源码下载https://github.com/eclipse/paho.mqtt.c.git

编译步骤

unzip paho.mqtt.c-master.zip
cd paho.mqtt.c-master/
make CC=arm-linux-gnueabihf-gcc \
	CFLAGS="-I$PWD/../openssl-1.1.0k/tmp/include" \
	LDFLAGS="-L$PWD/../openssl-1.1.0k/tmp/lib -lssl -lcrypto"

至此,编译已经完成了,相关的so动态库文件和测试程序已经生成在build/output/目录下了,我们可以从各个目录下逐个提取所需要的文件。当然,如果我们不想逐个文件地找,就需要继续后面的安装步骤。

安装步骤

由于我们是仿照编译到PC机的方法进行的交叉编译,所以我们还需要修改Makefile之后才能进行安装到自定义目录下,Makefile修改如下:

--- a/Makefile
+++ b/Makefile
@@ -74,14 +74,14 @@ ifndef exec_prefix
        exec_prefix = ${prefix}
 endif

-bindir = $(exec_prefix)/bin
-includedir = $(prefix)/include
-libdir = $(exec_prefix)/lib
+bindir = $(exec_prefix)/bin/
+includedir = $(prefix)/include/
+libdir = $(exec_prefix)/lib/
 datarootdir = $(prefix)/share
 mandir = $(datarootdir)/man
-man1dir = $(mandir)/man1
-man2dir = $(mandir)/man2
-man3dir = $(mandir)/man3
+man1dir = $(mandir)/man1/
+man2dir = $(mandir)/man2/
+man3dir = $(mandir)/man3/

 SOURCE_FILES = $(wildcard $(srcdir)/*.c)
 SOURCE_FILES_C = $(filter-out $(srcdir)/MQTTAsync.c $(srcdir)/MQTTVersion.c $(srcdir)/SSLSocket.c, $(SOURCE_FILES))
@@ -289,7 +289,7 @@ install: build
        $(INSTALL_PROGRAM) ${INSTALL_OPTS} ${PAHO_C_SUB_TARGET} $(DESTDIR)${bindir}
        $(INSTALL_PROGRAM) ${INSTALL_OPTS} ${PAHO_CS_PUB_TARGET} $(DESTDIR)${bindir}
        $(INSTALL_PROGRAM) ${INSTALL_OPTS} ${PAHO_CS_SUB_TARGET} $(DESTDIR)${bindir}
-       $(LDCONFIG) $(DESTDIR)${libdir}
+       #$(LDCONFIG) $(DESTDIR)${libdir}
        ln -s lib$(MQTTLIB_C).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_C).so
        ln -s lib$(MQTTLIB_CS).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_CS).so
        ln -s lib$(MQTTLIB_A).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTTLIB_A).so

修改完毕之后,执行以下命令即可安装,这里所谓的安装其实就是将我们需要的文件统一放到指定目录下而已:

mkdir -p tmp/bin tmp/lib tmp/include tmp/share/man/man1 tmp/share/man/man2 tmp/share/man/man3
make prefix=$PWD/tmp install
tree ./tmp

3、编译思路记录

查看根目录下的README.md说明,我们比较感兴趣的两部分内容:Build instructions for GNU MakeCross compilation。前者是对于PC机上的安装,但是我们可以看到“CC”、“CFLAGS”和“LDFLAGS”的描述,这就联想到第5篇文章交叉编译mosquitto了,而后者是通过cmake重新生成交叉编译的Makefile,但是测试了下失败了。所以选择了前者的编译方法,即上面的make CC=arm-linux-...命令。

编译完成之后,查看Makefile了解安装步骤。刚开始执行了make prefix=$PWD/tmp install安装,发现提示了/sbin/ldconfig ... Permission denied,但这条命令似乎是对于安装在PC而言的,所以把它注释掉再次编译。然后又提示了Not a directory等,查看安装目录tmp发现里面的子目录在安装的时候乱套了(不是安装到子目录下,而是直接把它们当成了目标程序),所以再次修改Makefile将子目录后的斜杆“/”给补上,然后对这些子目录逐个给它创建,然后编译,成功了。

猜你喜欢

转载自blog.csdn.net/weixin_44498318/article/details/113445509