Mosquitto动态链接库的交叉编译与移植
前段时间对Mosquitto进行了ARM移植,找了大量的资料,没有一个可以一次性成功的,于是借鉴了很多文章,并自己摸索最后得出了这篇移植结论,按照这种方法应该可以一次性交叉编译成功。如果有什么问题,请在下面给我留言,谢谢。
Ubuntu版本:14.04LTS
交叉编译链:友善之臂提供的4.4.3版本工具链
(/opt/FriendlyARM/toolchain/4.4.3/bin/arm-linux-gcc)
移植目录为/home/mosquito
安装目录为/home/mosquitto/arm
可以使用两种方式进行交叉编译
第一种方法:使用./configure配置后进行make && make install (这种方法需要两个依赖库,但是在make的时候需要大量修改Makefile中的依赖包目录,容易出错)
参考网址:https://blog.csdn.net/gaoyadianta/article/details/72831665
https://blog.csdn.net/L982817732/article/details/78926061
第二种方法:使用cmake配置后进行make && make install (这种方法需要三个依赖库,在配置时不需要修改太多地方,操作起来比较容易,因此在这里选择了第二种方法)
参考网址:https://blog.csdn.net/sqshining/article/details/69660650
https://blog.csdn.net/sqshining/article/details/69664310#commentsedit
cmake-3.7.2
wget https://cmake.org/files/v3.7/cmake-3.7.2.tar.gz
autoconf 用来生成configure文件
wget https://alpha.gnu.org/gnu/autoconf/autoconf-2.68b.tar.gz
libtool
wget https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz
新建一个文件夹,在这个文件夹中进行所有的移植操作。
拉取上面三个压缩包,然后解压缩进行本地编译,命令如下
./configure
make
make install
wget https://www.openssl.org/source/old/1.0.0/openssl-1.0.0.tar.gz
tar –zxvf openssl-1.0.0.tar.gz
cd openssl-1.0.0/
./config no-asm shared --prefix=/home/mosquitto/arm/ssl
注意:--prefix后面跟着是make install的安装目录,可以自行定义
export cross=arm-linux-
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
报错
原因是Makefile里面有-m64这句话。
解决方法:vim Makefile,找到-m64,删除,我这里一共发现了两处地方
再次
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
make install
报错
原因是由于OpenSSL 1.0.0 与 perl5.18 不兼容。
解决方法:删除 pod2man文件 rm /usr/bin/pod2man
再次
make install
成功,查看编译出来的东西
Include/里面是头文件
lib64里面是动态库
在后面会用到
wget https://c-ares.haxx.se/download/c-ares-1.14.0.tar.gz
tar -zxvf c-ares-1.14.0.tar.gz
cd c-ares-1.14.0/
./configure --host=arm-linux --prefix=/home/mosquitto/arm/ares
make
make install
成功,查看编译出来的东西
lib里面是动态库
在后面会用到
下载地址:https://sourceforge.net/projects/e2fsprogs/files/e2fsprogs/1.41.14/e2fsprogs-1.41.14.tar.gz/download
下载完后通过ssh放到移植目录下
tar -zxvf e2fsprogs-1.41.14.tar.gz
cd e2fsprogs-1.41.14/
./configure --host=arm-linux --prefix=/home/mosquitto/arm/e2fsprogs
make
make install
把lib下的uuid目录拷贝到安装目/home/mosquitto/arm/e2fsprogs下
cp -r lib/uuid/ /home/mosquitto /arm/e2fsprogs
成功,查看编译出来的东西
uuid目录下的头文件在后面要用到
wget https://mosquitto.org/files/source/mosquitto-1.4.8.tar.gz
tar -zxvf mosquitto-1.4.8.tar.gz
cd mosquitto-1.4.8/
找到CMakelists.txt第61行find_package(OpenSSL REQUIRED),在此句之前加入
set(OPENSSL_ROOT_DIR "/home/mosquitto/arm/ssl")
set(OPENSSL_LIBRARIES "/home/mosquitto/arm/ssl/lib64/")
然后找到option(WITH_SRV “Include SRV lookup support?” ON)这一行,在下面加入
# Simple detect uuid
set(CMAKE_INCLUDE_PATH /home/mosquitto/arm/e2fsprogs)
set(CMAKE_LIBRARY_PATH /home/mosquitto/arm/e2fsprogs/uuid)
find_path(UUID_HEADER NAMES uuid/uuid.h)
if (UUID_HEADER)
include_directories(${UUID_HEADER})
message(STATUS "found uuid/uuid.h at:${UUID_HEADER}")
find_library(UUID_LIBRARY NAMES uuid)
if (UUID_LIBRARY)
message(STATUS "found libuuid at:${UUID_LIBRARY}")
set (LIBRARIES ${LIBRARIES} ${UUID_LIBRARY})
else(UUID_LIBRARY)
message(FATAL_ERROR "uuid library not found!" )
endif (UUID_LIBRARY)
else (UUID_HEADER)
message(WARNING "uuid library not found.")
endif (UUID_HEADER)
然后找到lib/CMakelists.txt的第54行,这一段改后如下
if (${WITH_SRV} STREQUAL ON)
# Simple detect c-ares
find_path(ARES_HEADER ares.h /home/mosquitto/arm/ares/include)
if (ARES_HEADER)
add_definitions("-DWITH_SRV")
include_directories(${ARES_HEADER})
message(STATUS "found ares.h at:${ARES_HEADER}")
find_library(ARES_LIBRARY cares /home/mosquitto/arm/ares/lib)
if (ARES_LIBRARY)
message(STATUS "found libcares at:${ARES_LIBRARY}")
set (LIBRARIES ${LIBRARIES} ${ARES_LIBRARY})
else(ARES_LIBRARY)
message(FATAL_ERROR "not found libcares" )
endif (ARES_LIBRARY)
else (ARES_HEADER)
message(WARNING "c-ares library not found.")
endif (ARES_HEADER)
endif (${WITH_SRV} STREQUAL ON)
然后在mosquitto目录下执行命令
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/mosquitto/arm/mosquitto/ CMakeLists.txt
如果这样报错,说明交叉编译链没有在全局变量里
解决方法:source /etc/profile
接下来会有两种报错情况
第一种:没有找到openssl的库路径
解决方法:手动进入文件进行修改 vim CMakeCache.txt
在vim中搜索ssl转到到下图这里
手动修改到openssl的目录
再次使用命令
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/mosquitto/arm/mosquitto/ CMakeLists.txt
可以看到已经找到了openssl的库
第二种:识别到x86系统的openssl的库路径
解决方法:手动进入文件进行修改 vim CMakeCache.txt
在vim中搜索ssl转到到下图这里
手动修改到openssl的目录
再次使用命令
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/mosquitto/arm/mosquitto/ CMakeLists.txt
可以看到已经找到了openssl的库
如果没有遇到以上两种报错情况,打印信息完全正确的话,就可以使用make编译
报错没有找到动态链接库
解决方法:这里没有找到uuid的动态链接库,那么要交叉编译libuuid
参考网站:http://blog.csdn.net/litao31415/article/details/52917160
下载libuuid源码使用ssh放入移植目录
tar -zxvf libuuid-1.0.3.tar.gz
cd libuuid-1.0.3/
./configure --host=arm-linux CC=arm-linux-gcc --prefix=/home/mosquitto/arm/libuuid
make
make install
成功,查看编译出来的东西
Lib目录下是我们需要的动态链接库
使用 arm-linux-gcc –v 命令查看编译器动态库的路径
cd /opt/FriendlyARM/toolchain/4.4.3/ 进入工具链目录
cd arm-none-linux-gnueabi/
ls –l 发现lib是一个软链接
cd sys-root/lib/ 进入目录
将刚刚编译出来的liduuid动态链接库拷贝到该目录,注意,.so文件是一个链接,要将其链向的源文件一起拷贝过来
cp /home/mosquitto/arm/libuuid/lib/libuuid* ./
回到移植目录
cd /home/mosquitto/mosquitto-1.4.9/
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/mosquitto/arm/mosquitto/ CMakeLists.txt
make
成功编译。如果还是报错缺少动态链接库的,就像刚刚的方法一样将动态库文件连源文件一起拷贝至编译器的库文件里,再重新回来编译(openssl和 ares 的动态库在前面已经编译好了,直接拷贝过去就行)
继续
make install
没有报错,查看安装目录
cd lib/ 进入lib目录
需要的mosquitto动态库已经成功编译
到此,mosquitto的动态链接库交叉编译完成!