先说明一下,遇到的问题。我之前在 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-2009q1-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 执行的。

MQTT再学习 -- 交叉编译与移植相关推荐

  1. MQTT再学习 -- 安装MQTT客户端及测试

    上一篇文章我们已经讲了 MQTT 服务器的搭建,参看:MQTT再学习 -- 搭建MQTT服务器及测试 接下来我们看一下 MQTT 客户端. 一.客户端下载 首先,客户端也有多种,我们需要面临选择了. ...

  2. MQTT再学习 -- 漫谈MQTT协议

    MQTT 服务器搭建我们已经完成了,现在回过头来看协议. 参看:MQTT 官网 参看:MQTT_V3.1_Protocol_Specific 参看:MQTT协议中文版 参看:MQTT协议中文版 上面这 ...

  3. C语言再学习 -- 查看版本及内核信息(转)

    参看:Linux(Ubuntu)系统查看版本及内核信息 查看ubuntu版本号 方法一:  cat /etc/issue root@ubuntu:~# cat /etc/issue Ubuntu 12 ...

  4. LIVE555再学习 -- DM368/Hi3516A 交叉编译

    接着上篇文章来讲,参看:LIVE555再学习 -- Linux 下编译 下载源码.文件介绍部分不再介绍.主要看配置编译部分. 三.配置编译 DM368 的交叉编译器为 arm-none-linux-g ...

  5. MQTT协议学习:3、MQTT客户端实例

    MQTT协议学习:3.MQTT客户端实例 文章目录 MQTT协议学习:3.MQTT客户端实例 1. 前言 2. Paho MQTT (1). Go客户端实例 (2). Python客户端实例 (3). ...

  6. LIVE555再学习 -- testRTSPClient 实例

    上一篇文章简单看了一遍 testRTSPClient  的源码,接下来举几个应用实例加深一下. 首先什么都不做修改,先执行一遍,看一下. 一.执行 testRTSPClient 特么,上面的东西我没看 ...

  7. UNIX再学习 -- 线程

    终于要讲到线程部分,线程和进程让人够头痛的内容. 一.线程概念 老样子,我们还是按我们讲进程时的方式说起,参看:UNIX再学习 -- 进程环境 首先需要了解下,什么是线程. Linux 下的线程,可能 ...

  8. 日常生活 -- 嵌入式再学习前言

    UNIX再学习已过半,基础部分算是讲完了.嵌入式开发才是重头戏,我会以 S5PV210 .DM368.DM8168.HI3516等开发板为基础来展开. 先从硬件部分讲起,开发板电路设计.芯片器件介绍. ...

  9. C语言再学习 -- 位操作

    一.二进制 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世 ...

最新文章

  1. bzoj4592[SHOI2015]脑洞治疗仪
  2. android gradle build process
  3. 【双100%提交】剑指 Offer 09. 用两个栈实现队列
  4. 12行代码AC——例题6-6 小球下落(Droppint Balls, UVa 679)——解题报告
  5. STM32 map文件解析
  6. html 小于号 乱码,shell重定向(大于号,小于号,左右,21,)
  7. 微信小程序 --- 获取网络状态
  8. 用 PHPRPC 实现 Ajax 安全登录
  9. JavaScript学习笔记——事件
  10. Single-page application
  11. ajax响应码,ajax处理响应(三)(示例代码)
  12. sublime test3 安装及配置
  13. model.train() model.eval()
  14. ai带来的革命_Covid-19将加速AI医疗保健革命
  15. 哪种修复redis未授权访问漏洞的方法是相对不安全的_redis漏洞复现
  16. Gambit 4.运行时选项
  17. Win10修改EFI分区文件
  18. 斐讯AI音箱怎么绑定扫地机器人_斐讯智能音箱常见问题解答
  19. 亭子早期博客中16进制颜色值地址
  20. 电脑知识:电脑被黑客攻击,那么如何电脑判断沦为“肉鸡”?

热门文章

  1. linux压缩与解压缩命令
  2. 【Redis】Linux下Redis安装与redis-desktop-manager使用(无法连接Redis服务器解决方法)...
  3. 纯CSS3画出小黄人并实现动画效果
  4. 开发者福利:三款 iOS 应用原型开发工具
  5. 判断点是否处于多边形内的三种方法(转)
  6. 医疗软件产品核心算法部分说明--转载截取
  7. 基于小波变换的图像边缘检测(matlab祖传代码注释)
  8. [云炬创业基础笔记]第十一章创业计划书测试10
  9. 云炬创业政策学习笔记20210116
  10. 用WebBrowser实现HTML界面的应用和交互