专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
嵌入式
5.MQTT再学习 -- 交叉编译与移植
2019-07-13 04:00
发布
生成海报
站内文章
/
嵌入式Linux
11483
0
1594
先说明一下,遇到的问题。我之前在 Ubuntu12.04 gcc 下可以搭建 mqtt 服务器生成的 libmosquitto.so.1。
参看:
MQTT再学习 -- 搭建MQTT服务器及测试
现在我要在 DM368 的交叉编译器 arm-none-linux-gnueabi-gcc 链接共享库 libmosquitto.so.1。出现问题 cannot find -lmosquitto 即共享库找不到。
然后我想可能是编译器不匹配 ,然后想用 DM368的交叉编译器arm-none-linux-gnueabi-gcc 再安装一遍 mqtt 服务器让其生成 共享库 libmosquitto.so.1,然后就make出现了一堆的错误。
这上面是我在群里发帖咨询的遇到的问题,现在最终成功解决!!
现在就讲一下是怎么操作的。
一、准备工作
上面说的编译不同造成的无法链接共享库这个是真的,需要重新 make 生成
libmosquitto.so.1。
我们现在的虚拟机上有安装
交叉编译器
arm-none-linux-gnueabi-gcc 需要查看一下它所在的位置
。
# which arm-none-linux-gnueabi-gcc
/opt/arm
-2009
q1
-203
/bin/arm-none-linux-gnueabi-gcc
然后下载需要的软件
主要是两个 mosquitto-1.4.14 和 openssl-1.0.1c
下载:
openssl-1.0.1c
下载:
mosquitto-1.4.14
二、MQTT源码交叉编译
参看:
mosquitto-1.4.9在Linux上的编译
(1)编译需要依赖的openssl
将上面下载的文件 openssl-1.0.1c.tar.gz 解压
tar -zxvf openssl-1.0.1c.tar.gz
然后进入该文件
cd openssl-1.0.1c
然后执行:
./config no-asm shared --prefix=/opt/com/ssl
注意 :
/opt/com/ssl/ 文件夹是指定存放共享库的位置,你自己要先创建好的哦
然后修改Makefile中下列变量的值:
CC = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc
AR = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ar $(ARFLAGS) r
RANLIB = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ranlib
注意:
这里就是为什么上面要你查看交叉编译所在位置的原因了。
再有啊,记得需要将之前的变量值注释掉的哦。
我第一次就忘记了,然后再编译的时候出现错误:
Relocations in generic ELF (EM: 3) libcrypto.a(e_old.o): could not read symbols: File in wrong format
解决方法,就是执行:
#make clean -w
最后就是执行编译:
make && make install
(2)编译mosquitto-1.4.14客户端
将上面下载的文件 mosquitto-1.4.14.tar.gz
解压
tar -zxvf mosquitto-1.4.14.tar.gz
然后进入该文件
cd
mosquitto-1.4.14
修改config.mk
WITH_SRV:=no
WITH_UUID:=no
WITH_WEBSOCKETS:=no
WITH_DOCS:=no
CFLAGS += -I/opt/com/ssl/include
LDFLAGS += -L/opt/com/ssl/lib -lssl -lcrypto
STRIP?=arm-none-linux-gnueabi-strip
注意:
/opt/com/ssl/ 上面说了是共享库文件所在位置,你自己创建的。不过现在里面是有东西的。
执行编译
make CC=/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc CXX=/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-g++
最后执行
make install
最终在 /usr/locat/lib 目录下可以看到新生成的 libmosquitto.so.1
注意:
如果不修改 STRIP?=arm-none-linux-gnueabi-strip
会出现错误:strip: Unable to recognise the format of the input file `/usr/local/lib/libmosquitto.so.1'
这是参考那篇文章里所没有提到的。
三、总结
最后想不想看一下,gcc 和
arm-none-linux-gnueabi-gcc 编译生成的
libmosquitto.so.1 到底有啥不同。
gcc编译:
# file libmosquitto.so.1
libmosquitto.so
.1
: ELF
32
-bit LSB shared object, Intel
80386
, version
1
(SYSV), dynamically linked,
BuildID[sha1]=
0xb05795243eded68d65abe39b12212099c849965b
,
not
stripped
arm-none-linux-gnueabi-gcc 交叉编译:
# file libmosquitto.so.1
libmosquitto.so
.1
: ELF
32
-bit LSB shared object, ARM, version
1
(SYSV), dynamically linked,
not
stripped
看出来了么? 是类型啦,主要是在 Intel 80386 执行还是在 ARM 执行的。
Ta的文章
更多
>>
5.MQTT再学习 -- 交叉编译与移植
0 个评论
联系博文视点!
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮