MQTT交叉编译(海思v300 arm-hisiv300-linux-):openssl、paho.mqtt.c、paho.mqtt.cpp

简介: MQTT交叉编译(海思v300 arm-hisiv300-linux-):openssl、paho.mqtt.c、paho.mqtt.cpp

编译环境

2018122814580746.png

一、下载 openssl、paho.mqtt.c、paho.mqtt.cpp

这里使用的版本分别是

openssl-OpenSSL_1_1_1g.zip  
paho.mqtt.c-1.3.0.zip  
paho.mqtt.cpp-1.0.1.zip

openssl GitHub下载地址

paho.mqtt.c GitHub下载地址

paho.mqtt.cpp GitHub下载地址


二、编译脚本

复制下面脚本保存为 mqtt_install.sh

#! /bin/sh
# mqtt_install.sh
# 指定编译结果的路径
RESULT_DIR=$(pwd)/result_dir
RESULT_SSL=${RESULT_DIR}/ssl_result
RESULT_MQTT_C=${RESULT_DIR}/mqtt.c
RESULT_MQTT_CPP=${RESULT_DIR}/mqtt.cpp
# 指定预案代码目录
SRC_SSL_DIR=openssl-OpenSSL_1_1_1g
SRC_MQTT_C_DIR=paho.mqtt.c-1.3.0
SRC_MQTT_CPP_DIR=paho.mqtt.cpp-1.0.1 
# 指定交叉编译工具
CROSSS_COMPILE_TOOL=arm-hisiv300-linux-
# 解压
unzip openssl-OpenSSL_1_1_1g.zip
unzip paho.mqtt.c-1.3.0.zip
unzip paho.mqtt.cpp-1.0.1.zip
# 1. 编译ssl
cd ${SRC_SSL_DIR}
# 1.1 配置输出目录和交叉编译器, (linux-generic32表示是32位操作系统,个别文章加了这个选项就不用去掉 -m64,我这里行不通)
./config no-asm shared no-async --prefix=${RESULT_SSL}  --cross-compile-prefix=${CROSSS_COMPILE_TOOL}
# 1.2 删除 -m64
sed -i 's/-m64//' Makefile
# 1.3 添加 CFLAGS+=-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations
sed -i '/CFLAGS=-DDSO_DLFCN/a\CFLAGS+=-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations' Makefile
# 1.4 make && make install
make && make install
cd ..
# 2. 编译 paho.mqtt.c-1.2.1
cd ${SRC_MQTT_C_DIR}
# 2.1 设置 prefix 目录
sed -i '/ifndef prefix/i\prefix='${RESULT_MQTT_C}'\' Makefile
sed -i '/CC ?= gcc/a\CC='${CROSSS_COMPILE_TOOL}'gcc\' Makefile
# 2.2 置顶 ssl 库路径
sed -i '/$(CFLAGS)/i\
CFLAGS := -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations -I '${RESULT_SSL}'/include \
LDFLAGS := -L '${RESULT_SSL}'/lib\
' Makefile
# 2.3 
make 
# 2.4 拷贝结果
rm ${RESULT_MQTT_C} -rf
mkdir -p ${RESULT_MQTT_C}/include
mkdir -p ${RESULT_MQTT_C}/lib
cp build/output/libpaho-mqtt3a.* ${RESULT_MQTT_C}/lib -far
cp src/MQTT*.h ${RESULT_MQTT_C}/include -far
cd ..
# 3.编译 paho.mqtt.cpp-1.0.1
cd ${SRC_MQTT_CPP_DIR}
# 3.1 修改 CMakeList.txt ,使支持 C++11
sed -i '/C++11 build flags/a\add_definitions(-D_GLIBCXX_USE_C99=1)\' CMakeLists.txt
# 3.2 
# 这里的 DPAHO_MQTT_C_LIBRARIES 指定要使用哪个库,库的类型在 paho-mqtt.c 的 README 里有说到
mkdir build_arm 
cd build_arm 
cmake ..  -DCMAKE_CXX_COMPILER=${CROSSS_COMPILE_TOOL}g++ \
-DCMAKE_INSTALL_PREFIX=${RESULT_MQTT_CPP} \
-DPAHO_MQTT_C_LIBRARIES=${RESULT_MQTT_C}/lib/libpaho-mqtt3a.so \
-DPAHO_MQTT_C_INCLUDE_DIRS=${RESULT_MQTT_C}/include \
-DOPENSSL_SSL_LIBRARY=${RESULT_SSL}/lib/libssl.so  \
-DOPENSSL_INCLUDE_DIR=${RESULT_SSL}/include  \
-DOPENSSL_CRYPTO_LIBRARY=${RESULT_SSL}/lib/libcrypto.so \
-DCMAKE_CXX_FLAGS="-std=gnu++11 -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -ffunction-sections -mno-unaligned-access -fno-aggressive-loop-optimizations"
# 3.3 编译
make && make install

三、执行编译脚本

ubuntu:/home/samba/MQTT$ ls
mqtt_install.sh  openssl-OpenSSL_1_1_1g.zip  paho.mqtt.c-1.3.0.zip  paho.mqtt.cpp-1.0.1.zip
ubuntu:/home/samba/MQTT$ ./mqtt_install.sh 
...
...
...
ubuntu:/home/samba/MQTT$ ls
mqtt_install.sh         openssl-OpenSSL_1_1_1g.zip  paho.mqtt.c-1.3.0.zip  paho.mqtt.cpp-1.0.1.zip
openssl-OpenSSL_1_1_1g  paho.mqtt.c-1.3.0           paho.mqtt.cpp-1.0.1    result_dir
ubuntu:/home/samba/MQTT$ ls result_dir/
mqtt.c  mqtt.cpp  ssl_result

执行脚本后会在当前目录生成一个目录 result_dir,里面有 mqtt.cmqtt.cpp

2018122814580746.png

2018122814580746.png

四、注意

4.1 如果编译mqtt.cpp时报错,且与 cmake 有关的,可以更新一下 cmake

https://cmake.org/files/v3.20/

tar -xzvf cmake-3.13.0-Linux-x86_64.tar.gz
# 解压出来的包,将其放在 /opt 目录下,其他目录也可以,主要别以后不小心删了
sudo mv cmake-3.13.0-Linux-x86_64 /opt/cmake-3.13.0
# 建立软链接
sudo ln -sf /opt/cmake-3.13.0/bin/*  /usr/bin/
# 查看 cmake 版本
cmake --version

4.2 如果编译mqtt.cpp时报如下错误,则可能是没配置好C++11相关的配置

/home/samba/MQTT/paho.mqtt.cpp-1.0.1/build_arm$ make
Consolidate compiler generated dependencies of target paho-cpp-objs
[  7%] Building CXX object src/CMakeFiles/paho-cpp-objs.dir/async_client.cpp.o
In file included from /home/samba/MQTT/paho.mqtt.cpp-1.0.1/src/mqtt/token.h:29:0,
                 from /home/samba/MQTT/paho.mqtt.cpp-1.0.1/src/mqtt/async_client.h:29,
                 from /home/samba/MQTT/paho.mqtt.cpp-1.0.1/src/async_client.cpp:19:
/home/samba/MQTT/paho.mqtt.cpp-1.0.1/src/mqtt/exception.h: In constructor ‘mqtt::exception::exception(int)’:
/home/samba/MQTT/paho.mqtt.cpp-1.0.1/src/mqtt/exception.h:56:39: error: ‘to_string’ is not a member of ‘std’
   : std::runtime_error("MQTT error ["+std::to_string(code)+"]"), code_(code) {}
                                       ^
/home/samba/MQTT/paho.mqtt.cpp-1.0.1/src/mqtt/exception.h: In constructor ‘mqtt::exception::exception(int, const string&)’:
/home/samba/MQTT/paho.mqtt.cpp-1.0.1/src/mqtt/exception.h:63:38: error: ‘to_string’ is not a member of ‘std’
    std::runtime_error("MQTT error ["+std::to_string(code)+"]: "+msg),
                                      ^
make[2]: *** [src/CMakeFiles/paho-cpp-objs.dir/async_client.cpp.o] Error 1
make[1]: *** [src/CMakeFiles/paho-cpp-objs.dir/all] Error 2
make: *** [all] Error 2

解决办法:

paho.mqtt.cpp-1.0.1目录下的CMakeLists.txt下一行加上

add_definitions(-D_GLIBCXX_USE_C99=1)

2018122814580746.png

交叉编译Gcc 4.8.3 加上-D_GLIBCXX_USE_C99=1才能使用to_string,然后再重新执行cmake,make,

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
6月前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
229 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
6月前
|
消息中间件 Linux 数据安全/隐私保护
linux mq的安装并设置开机启动 图文!!
linux mq的安装并设置开机启动 图文!!
217 0
|
6月前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
339 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
5月前
|
Linux
Linux交叉编译+粤嵌LCD实现三色图
Linux交叉编译+粤嵌LCD实现三色图
|
2月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
2月前
|
消息中间件 Linux
linux之centos安装rabbitmq
linux之centos安装rabbitmq
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
消息中间件 Unix Linux
在Linux中,RabbitMQ是什么?
在Linux中,RabbitMQ是什么?
|
3月前
|
存储 算法 Linux
在Linux中,如何理解加密工具?如GnuPG和OpenSSL。
在Linux中,如何理解加密工具?如GnuPG和OpenSSL。
|
6月前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
111 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库