MQTT学习(四)-linux下交叉编译

mosquitto在运行的时候需要用到几个比较重要的动态库libmosquitto.so, libssl.so, libcrypto.so,需要参看用户的配置,可能不光光需要包含这么多库,本文章在设置是配置项如下:
MQTT学习(四)-linux下交叉编译_第1张图片

其中libmosquitto.so是由mosquitto的源代码编译来的一些函数的动态库,另外两个则需要先进行交叉编译,生成ARM架构的动态库才可以在编译的时候应用。

1.交叉编译openssl
libssl.so和libcrypto.so其实是openssl的动态库,所以需要进行openssl的交叉编译。我用的是openssl-1.0.2e,版本之间应该差别不大。下载openssl源代码,用命令:wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2e.tar.gz
之后tar -zxvf openssl-1.0.2e.tar.gz将其解压
./config no-asm -shared – prefix=/usr/local/ssl-1.0.2/, 注意no-sam一定要有,–prefix为安装目录,如果不执行install可以不指定
另外,需要更改编译器,
vim Makefile
找到CC=gcc(也可能是CC=cc)
将其修改为CC=arm-linux-gnueabihf-gcc(你自己所用到的交叉编译器)
将SHLIB_VERSION_NUMBER=1.0.0改为1.0.2
将SHLIB_MINOR=0.0修改为0.2,保存退出
然后,执行make,需要等待大概3-5分钟左右的时间,make完毕。
此时可以发现,当前目录下出现了libssl.so.1.0.2和libcrypto.so.1.0.2

2.交叉编译libuuid
参考网站:http://blog.csdn.net/litao31415/article/details/52917160
这个网站的方法是自动生成makefile文件,实际上libuuid的源码也是自动生成makefile的(我找到的是这样)。
./configure –host=arm-linux CC=arm-none-linux-gnueabi-gcc –prefix=/home/default/share/mtd_ulity/pub

–host:表示运行环境,后面跟着的CC表示编译工具链
–prefix=$(pwd)/install :表明安装路径

接着运行 make; make install .既可以在安装目录下生成库文件和.h文件

3.交叉编译libmosquitto及mosquitto
这一部分是同时完成的。首先需要从官网下载mosquitto的源文件
wget https://mosquitto.org/files/source/mosquitto-1.4.8.tar.gz
下载后解压,进入到mosquitto-1.4.8目录下。
下面就要对Makefile进行修改:
mosquitto的源代码分了几个部分,makefile也包含好几个,首先在主目录下有一个Makefile和一个config.mk,执行命令的时候,会首先调用Makefile,Makefile里面第一行“include config.mk”就会将config.mk文件包含进来,相当于config.mk文件的内容也是Makefile文件的内容,在主目录下的Makefile文件里面,会分别进入./lib, ./client, ./src这三个目录下分别执行make命令,而在对应的这三个目录下,又分别有三个Makefile文件,分别对这三部分的相应内容进行编译。

(1)首先修改编译器
打开config.mk文件,在文件末尾添加如下语句
CROSS_COMPILE=arm-linux-gnueabihf-
CC=gcc
CXX=g++

(2)接下来修改头文件的引用位置
在config.mk文件中,有一行内容是”LIB_CFLAGS:= CFLAGS C F L A G S {CPPFLAGS} -I. -I.. -I../lib“,指出了编译过程中需要的头文件可以放置在如下几个录:./ ./../ ./../lib。
但是我们要将openssl和uuid的头文件加进去。这边直接找到源码,复制到一个新建一个文件夹(third_lib),在将这个文件夹路径加入LIB_CFLAGS即可。
注意:LIB_CFLAGS为其他文件调用的路径,为./lib, ./client, ./src的上一级文件,如./lib下文件路径调用openssl/ssl.h,则在config.mk中应该这样写-I../third_lib

(注意openssl文件夹里面的一些.h头文件是软连接文件,需要将其指向文件一同复制到newdir中去)。

(3)修改动态库文件的调用位置
在config.mk中,将LIB_LDFLAGS:=${LDFLAGS}这是表示其链接库的变量,我们可以新建一个文件夹(newdir2),将libuuid.so,libssl.so,libcrypto.so放进去,再将newdir2的路径放到LIB_LDFLAGS中去,就能够在编译时动态调用到这三个动态库文件。(但是其实在src,lib,client这三个文件夹下面的make文件,使用的链接变量不一定都是LIB_LDFLAGS,需要根据具体的make文件做修改,读者可以自行修改;万变不离其宗,主要就是为了将这几个动态库加入编译中)

以上三个步骤完成,基本可以编出mosquitto的执行文件了。

注意:
1. 会报缺少ares.h文件
同样安装(同uuid安装方式./configure –host)即可
2. Client文件夹make中找不到” SSL_set_ex_data”之类的定义
是因为编译中没有把这个加上,在生成目标文件的时候,不指定这些库,就会报出未定义的错误
MQTT学习(四)-linux下交叉编译_第2张图片

你可能感兴趣的:(MQTT)