最近需要交叉編譯mosquitto,遇到一些小問題記錄一下。
1.眾所周知使用它自帶的Makefile編譯的時候,只需要在編譯前,指定它config.mk中的變量:CFLAGS頭文件路徑 和 LDFLAGS庫文件路徑就ok,例子如下:
export CFLAGS=“-I/home/.../openssl/... -I/home/.../uuid/..."
export LDFLAGS="-L/home/.../uuid/lib -L/home/.../openssl/lib -luuid -lcrypto -lssl"
make -j8
make install//如果你想指定安裝路徑的話 試一試這個
...
...
make prefix=/...
make install
2.當前,我們單獨編譯mosquitto的話是非常簡單的,但是我們要是想把它放到其他項目的cmakelist架構中呢。直接查找當然方便,但是要是外部庫比較多,移植和維護起來就會變的比較麻煩,所以我們使用?ExternalProject_Add 來在項目中構建編譯Mosquitto。
我用的是Mosquitto-1.6.9的源碼,地址
Tags · eclipse-mosquitto/mosquitto · GitHub
使用cmakelist組織的時候發現,/lib/目錄下messages_mosq.c源文件缺少了/src/deps目錄下的utilst.h文件,只需要做一個【復制】和【添加進/lib目錄下的cmakelist文件中】即可。
眾所周知,使用ExternalProject_Add的時候我們可以使用cmake傳入參數,我這里傳入了上層的構建install地址,然后發現mosquitto內部自己find_package了openssl,并且沒看到需要uuid,uuid先不管,openssl的話交叉編譯過程中,如果本地系統路徑下已經安裝了x86或者自己系統的openssl,架構版本和目標編譯可能不太一致。
這里我多次使用-DCMAKE_PREFIX_PATH和-DOPENSSL_ROOT_DIR來指定openssl的所有路徑,但是都失敗了,貌似是交叉編譯工具目錄下就有x86的openssl庫,所以find_package直接就找到了x86的ssl和crypto,指定似乎沒有用,怎么辦呢???
那我就不find_package了,我把mosquitto-1.6.9的源碼中的最上層的cmakelist中自己設置OPENSSL_INCLUDE_DIR和OPENSSL_LIBRARY,因為/src和/lib目錄下cmakelist構建使用了openssl庫中的ssl和crypto,所以這里我做一個分解,寫一個頭文件地址和兩個庫文件地址,直接找到庫文件
set(OPENSSL_SSL_LIBRARY "${OPENSSL_ROOT_DIR}/lib/libssl.so")
set(OPENSSL_CRYPTO_LIBRARY "${OPENSSL_ROOT_DIR}/lib/libcrypto.so")
- OPENSSL_ROOT_DIR是從外層傳?ExternalProject_Add的時候傳進來的
到這一步就該把find_package(openssl)注釋掉了,然后把/src和/lib兩個目錄下的cmakelist中的OPENSSL_LIBRARY換成OPENSSL_SSL_LIBRARY 和 OPENSSL_CRYPTO_LIBRARY。
我都想不到怎么還能編譯不過???