1. 程式人生 > >MQTT學習(四)-linux下交叉編譯

MQTT學習(四)-linux下交叉編譯

mosquitto在執行的時候需要用到幾個比較重要的動態庫libmosquitto.so, libssl.so, libcrypto.so,需要參看使用者的配置,可能不光光需要包含這麼多庫,本文章在設定是配置項如下:
這裡寫圖片描述

其中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{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”之類的定義
是因為編譯中沒有把這個加上,在生成目標檔案的時候,不指定這些庫,就會報出未定義的錯誤
這裡寫圖片描述