Mosquitto动态链接库的交叉编译与移植

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

  • 交叉编译openssl
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里面是动态库

在后面会用到

 

  • 交叉编译c-ares库
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里面是动态库

在后面会用到

 

  • 交叉编译e2fsprogs

下载地址: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目录下的头文件在后面要用到

 

  • 交叉编译Mosquitto
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的动态链接库交叉编译完成!

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值