标签:大量 解决方法 wget ons 比较 指定 程序 adduser director
1、资源介绍
Linux发行版:Ubuntu16.04
板子:x210(kernel:2.6.35,SoC:S5PV210)
toolchain:gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67)
cmake 3.5.1
2、基础认识
mosquitto在交叉编译的时候,一般需要用到几个比较重要的动态库 libssl.so, libcrypto.so,libuuid的库;在运行时需要openssl(libssl.so、libcrypto.so)、c-areas、mosquitto编译后的库。
所以,在编译mosquitto之前,我们先编译openssl、c-ares、e2fsprogs、libuuid;最后再去编译Mosquitto。
可以使用两种方式对Mosquitto进行交叉编译
第一种方法:使用./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
我的以下所有编译操作都在自定义的/home/xz/mosquiito中进行,所有的安装路径是:/home/xz/mosquiito/arm,以下涉及到的所有路径都要注意自己的是不是也是这样,下面不再提醒说明。
3、编译前的准备
(1)安装cmake version 3.5.1
apt-get install cmake
注意:apt-get安装的cmake的版本不一定跟我一样,影响不大。
(2)安装autoconf
下载源码
wget https://alpha.gnu.org/gnu/autoconf/autoconf-2.68b.tar.gz
解压并安装(默认安装目录,并不指定)
tar xvf autoconf-2.68b.tar.gz
cd autoconf-2.68b/
./configure
sudo make
sudo make install
(3)安装libtool
下载源码
wget https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz
解压并安装(默认安装目录,并不指定)
tar xvf libtool-2.4.6.tar.gz
./configure
sudo make
sudo make install
4、交叉编译openssl
wget https://www.openssl.org/source/old/1.0.0/openssl-1.0.0.tar.gz
tar xvf openssl-1.0.0.tar.gz
cd openssl-1.0.0/
./config no-asm shared --prefix=/home/xz/mosquitto/arm/ssl #--prefix为安装目录,需要自己提前创建好
注意:进行下面这样的操作,我的编译工具链已经手动创建好了arm-linux-xxx这样的符号符号链接,如果你没有,那么就用工具链的全称。
export cross=arm-linux- make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
出错:
百度可知:
原因是Makefile里面有-m64这句话。
解决方法:vim Makefile,找到-m64,删除,我这里一共发现了两处地方
vim Makefile
再次编译:
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
安装:
sudo make install
出错:
百度可知:
原因是由于OpenSSL 1.0.0 与 perl5.18 不兼容。
解决方法:删除 pod2man文件
sudo rm /usr/bin/pod2man -f
再次安装:
sudo make install
进一步确认openssl是否进行了交叉编译,还有编译它的交叉编译工具链的版本是否与我们板子内核版本支持,从下图可以卡出openssl确实进行了交叉编译,可以在arm架构板子上运行,编译的它的工具链最低支持的内核是2.6.16,而我的板子内核版本是2.6.35,完全没问题。
5、交叉编译c-ares
wget https://c-ares.haxx.se/download/c-ares-1.14.0.tar.gz
tar xvf c-ares-1.14.0.tar.gz
cd c-ares-1.14.0/
./configure --host=arm-linux --prefix=/home/xz/mosquitto/arm/c-ares ##注意:我的工具链已经创建arm-linux-xxx这样的符号链接,--prefixe是我指定的安装目录,这是在这步前创建好了的
make
可以看出,找到了交叉编译工具链,当我们make就是采用交叉编译了,也可以vi打开Makefile查看一下
安装:
make install
出错:
这是因为我登录的是普通用户,那么自然就想到前面加sudo
sudo make install
出错:
我的交叉编译工具链已经创建了arm-linux-ranlib符号链接,而且已经将工具链的路径,在/etc/profile中export导出到了PATH环境变量,为什么不行呢?
原因如下:
我export导出的arm交叉编译器目录到PATH中,是放在/etc/profile里的,我的用户为xz(普通用户)。
执行sudo make install时,加了sudo前缀,变成了root的工作环境和root的权限。
sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到 当前用户;而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权;
su - 、 su 和 sudo 的区别:
1.共同点:都是root用户的权限;
2.不同点:su仅仅取得root权限,工作环境不变,还是在切换之前用户的工作环境;su - 和sudo是完全取得root的权限和root的工作环境(工具目录不变)。
注意:sudo、su -切换到root时原用户的环境变量也一并丢失。
解决方法:
在执行make install之前,先su(获取root的权限,但工作目录不变),然后make insatll即可
su
make install
那么,从这里给我们的启示就是,当我们只能工作在普通用户时,编译这样的开源库,我们可以选择在一开始就su,从而获取到root权限(而不改变工作目录,还是原来普通用户的工作目录),这样后面直接make和make install就不会存在因为权限的问题而无法编译和安装了。
6、交叉编译e2fsprogs
解压配置:
su
tar xvf e2fsprogs-1.41.14.tar.gz
cd e2fsprogs-1.41.14
./configure --host=arm-linux --prefix=/home/xz/mosquitto/arm/e2fsprogs ##注意:我的工具链已经创建arm-linux-xxx这样的符号链接,--prefixe是我指定的安装目录,这是在这步前创建好了的
编译、安装:
make
make install
处出现下面的问题,但是百度没找到结果,发现别人交叉编译Mosquitto的博客,到这一步安装后,安装目录里的文件看起来跟我的是一样的,具体有没有漏什么就不知道,那么先这样
把源码e2fsprogslib下的uuid目录拷贝到安装目/home/mosquitto/arm/e2fsprogs下,uuid目录下的头文件在后面要用到
cp lib/uuid/ ../arm/e2fsprogs/ -r
7、交叉编译Mosquitto
注:凡是涉及到路径的都要注意,看你自己的是否也是这样
下载源码,解压编译
su ##获取root权限
wget https://mosquitto.org/files/source/mosquitto-1.4.8.tar.gz
tar xvf mosquitto-1.4.8.tar.gz
cd mosquitto-1.4.8
找到CMakelists.txt第61行find_package(OpenSSL REQUIRED),在此句之前加入以下内容:
set(OPENSSL_ROOT_DIR "/home/xz/mosquitto/arm/ssl") set(OPENSSL_LIBRARIES "/home/xz/mosquitto/arm/ssl/lib64/")
然后还在这文件中找到option(WITH_SRV “Include SRV lookup support?” ON)这一行,在下面加入以下内容:
# Simple detect uuid
set(CMAKE_INCLUDE_PATH /home/xz/mosquitto/arm/e2fsprogs)
set(CMAKE_LIBRARY_PATH /home/xz/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)
vi lib/CMakeLists.txt
#在find_path(ARES_HEADER ares.h),里面添加:
/home/xz/mosquitto/arm/c-ares/include #在add_definitions("-DWITH_SRV")之后,添加下面内容,并删掉或者注释:set (LIBRARIES ${LIBRARIES} cares)
include_directories(${ARES_HEADER}) message(STATUS "found ares.h at:${ARES_HEADER}") find_library(ARES_LIBRARY cares /home/xz/mosquitto/arm/c-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)
创建目录:
mkdir arm/mosquitto
配置:
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/xz/mosquitto/arm/mosquitto/ CMakeLists.txt
编译:
make
出错:
程序找到Ubuntu系统里的libssl.so,那么肯定不对,因为Ubuntu里的架构是x86-64,而程序需要的是arm架构,也就是要经过交叉编译得到的libssl.so,我们前面已经交叉编译openssl,得到的libssl.so
那么解决的方法就是,让程序优先找到它即可
vim CMakeCache.txt
输入ssl定位到下面第一行的位置:将其注释,另外指定libssl.so的路径:
OPENSSL_CRYPTO_LIBRARY:FILEPATH=/home/xz/mosquitto/arm/ssl/lib64/libcrypto.so
注意:每次进行CMakexxx这些配置文件的修改,都要重新cmake配置过
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/xz/mosquitto/arm/mosquitto/ CMakeLists.txt
再次编译:
make
同理,但是如果不知道我们有没有已经有交叉编译过生成的libcrypto.so库,我们可以通过下面方法,查看以下
sudo find / -name "libcrypto.so"
既然有的,那么向像面的操作一样处理
vim CMakeCache.txt
重新cmake配置以下
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/xz/mosquitto/arm/mosquitto/ CMakeLists.txt
再次编译:
make
链接出错:没有找到libuuid库
8、交叉编译libuuid
解压:
tar xvf libuuid-1.0.3.tar.gz
创建目录:
mkdir /home/xz/mosquitto/arm/libuuid
配置:
./configure --host=arm-linux CC=arm-linux-gcc --prefix=/home/xz/mosquitto/arm/libuuid
编译安装:
make
make install
有博客说可以通过下面这种方式找到交叉编译工具来链的动态链接库搜索路径
我懒得去找了,于是凭借感觉,把libuuid的库复制到交叉编译工具链的位置试试
cp /home/xz/mosquitto/arm/libuuid/lib/libuuid* /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib
然后,回到mosquitto源码顶层目录,接着再次编译:
make
完美!编译mosquitto成功
注:每一个开源库一般编译后都会生成带有测试程序,下面这几个就是,mosquitto是服务器程序,mosquitto_pub是发布消息的客户端程序,mosquitto_sub是订阅消息的客户端程序。
扩展:
如果自己编写发布/订阅客户端程序,然后想编译时,要加相应的头文件路径、动态库名字和其路径,例如,我的就是:
arm-linux-gcc mosquitto_client_pub.c -o mosquitto_client_pub -I/home/xz/mosquitto/arm/mosquitto/include -lmosquitto -L/home/xz/mosquitto/arm/mosquitto/lib -lssl -lcrypto -L/home/xz/mosquitto/arm/ssl/lib64 -lcares -L/home/xz/mosquitto/arm/c-ares/lib
如果在arm板,在启动mosquitto服务器时,碰到下面这样的情况:
解决方法:
创建一个mosquitto用户即可
adduser mosquitto
标签:大量 解决方法 wget ons 比较 指定 程序 adduser director
原文地址:https://www.cnblogs.com/xz-954042850-qq/p/12821626.html