J5 MQTT

跨平台编译工具:

这个是利用X86_64的ubuntu平台下进行交叉编译,用来构建适用于arm平台下的程序,安装教程以及测试测试代码一并放置如下:

gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu.tar
j5_test.zip
编译好之后可以查看编译的程序可执行平台类型,可以看到是arm平台下 :

编译好的文件在X86_64平台下不能运行,把他们拷贝到J5平台下,最后运行J5_test中程序运行结果输出如下,即交叉编译成功。

paho.mqtt.c 的J5 平台部署:

参考教程:
1、成功移植MQTT-PAHO到嵌入式arm-linux(主要参考链接)
2、基于i-mx287 ARM9的嵌入式linux上 交叉编译paho.mqtt.embedded-c
2、ARM平台移植Paho详解
3、移植paho.mqtt.c到嵌入式linux平台

下载mqtt源码,最好是在上面提到的X86_64ubutnu平台中下载,因为还要使用J5交叉编译工具
git clone https://github.com/eclipse/paho.mqtt.embedded-c.git

然后解压进入目录,修改Makefile文件,按照这个上面参考教程进行修改:成功移植MQTT-PAHO到嵌入式arm-linux,然后修改后是不会进行编译成功的,会报错,因为他调用的是arm平台下的gcc编译器,我们需要用X86_64平台下的J5交叉编译器来替换原来的arm平台下的编译器:

找到makefile原来的71行和161行: CC = arm-linux-gnueabihf-gcc -fPIC CC ?= gcc 替换为J5交叉编译工具的路径,更改后如下: CC = /opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc -fPIC CC ?= /opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

这里附上我修改好可以用的Makefile文件 ✌️

#*******************************************************************************
#  Copyright (c) 2009, 2014 IBM Corp.
# 
#  All rights reserved. This program and the accompanying materials
#  are made available under the terms of the Eclipse Public License v1.0
#  and Eclipse Distribution License v1.0 which accompany this distribution. 
# 
#  The Eclipse Public License is available at 
#     http://www.eclipse.org/legal/epl-v10.html
#  and the Eclipse Distribution License is available at 
#    http://www.eclipse.org/org/documents/edl-v10.php.
# 
#  Contributors:
#     Xiang Rong - 442039 Add makefile to Embedded C client
#*******************************************************************************/

# Note: on OS X you should install XCode and the associated command-line tools

SHELL = /bin/sh
.PHONY: clean, mkdir, install, uninstall, html 

# assume this is normally run in the main Paho directory
ifndef srcdir
  srcdir = MQTTPacket/src
endif

ifndef blddir
  blddir = build/output
endif

ifndef prefix
	prefix = /usr/local
endif

ifndef exec_prefix
	exec_prefix = ${prefix}
endif

bindir = $(exec_prefix)/bin
includedir = $(prefix)/include
libdir = $(exec_prefix)/lib

SOURCE_FILES_C = $(wildcard $(srcdir)/*.c)
OBJS = $(addsuffix .o,$(basename $(SOURCE_FILES_C)))

HEADERS = $(srcdir)/*.h


SAMPLE_FILES_C = pub0sub1 qos0pub
SYNC_SAMPLES = ${addprefix ${blddir}/samples/,${SAMPLE_FILES_C}}


TEST_FILES_C = test1
SYNC_TESTS = ${addprefix ${blddir}/test/,${TEST_FILES_C}}


# The names of libraries to be built
MQTT_EMBED_LIB_C = paho-embed-mqtt3c


# determine current platform
ifeq ($(OS),Windows_NT)
	OSTYPE = $(OS)
else
	OSTYPE = $(shell uname -s)
	MACHINETYPE = $(shell uname -m)
endif

ifeq ($(OSTYPE),Linux)

CC = /opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc -fPIC

ifndef INSTALL
INSTALL = install
endif
INSTALL_PROGRAM = $(INSTALL)
INSTALL_DATA =  $(INSTALL) -m 644

MAJOR_VERSION = 1
MINOR_VERSION = 0
VERSION = ${MAJOR_VERSION}.${MINOR_VERSION}

EMBED_MQTTLIB_C_TARGET = ${blddir}/lib${MQTT_EMBED_LIB_C}.so.${VERSION}


CCFLAGS_SO = -g -fPIC -Os -Wall -fvisibility=hidden -DLINUX_SO
FLAGS_EXE = -I ${srcdir}  -L ${blddir}

LDFLAGS_C = -shared -Wl,-soname,lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION}

all: build
	
build: | mkdir ${EMBED_MQTTLIB_C_TARGET} ${SYNC_SAMPLES} ${SYNC_TESTS}

clean:
	rm -rf ${blddir}/* ${srcdir}/../samples/transport.o
	
mkdir:
	-mkdir -p ${blddir}/samples
	-mkdir -p ${blddir}/test

${SYNC_TESTS}: ${blddir}/test/%: ${srcdir}/../test/%.c
	${CC} -g -o ${blddir}/test/${basename ${+F}} $< -l${MQTT_EMBED_LIB_C} ${FLAGS_EXE}


${SYNC_SAMPLES}: ${blddir}/samples/%: ${srcdir}/../samples/%.c ${srcdir}/../samples/transport.o
	${CC} -o $@ $^ -l${MQTT_EMBED_LIB_C} ${FLAGS_EXE}



${EMBED_MQTTLIB_C_TARGET}: $(OBJS) ${HEADERS_C}
	${CC} ${CCFLAGS_SO} -o $@ $(OBJS) ${LDFLAGS_C}
	-ln -s lib$(MQTT_EMBED_LIB_C).so.${VERSION}  ${blddir}/lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION}
	-ln -s lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION} ${blddir}/lib$(MQTT_EMBED_LIB_C).so


strip_options:
	$(eval INSTALL_OPTS := -s)

install-strip: build strip_options install

install: build 
	-mkdir -p $(DESTDIR)${libdir}
	-mkdir -p $(DESTDIR)${includedir}
	cp -r $(HEADERS) $(DESTDIR)${includedir}
	$(INSTALL_DATA) ${INSTALL_OPTS} ${EMBED_MQTTLIB_C_TARGET} $(DESTDIR)${libdir}



	/sbin/ldconfig $(DESTDIR)${libdir}
	ln -s lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so


uninstall:
	rm $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so.${VERSION}

	/sbin/ldconfig $(DESTDIR)${libdir}
	rm $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so


html:

ARDUINO_LIB_FILES = MQTTClient/src/*.h MQTTClient/src/arduino/*.h $(srcdir)/*
ARDUINO_SAMPLES = MQTTClient/samples/arduino/*
LEGAL_FILES = edl-v10 epl-v10 notice.html about.html CONTRIBUTING.md README.md library.properties

arduino: mkdir
	-mkdir -p ${blddir}/arduino/MQTTClient/examples
	-mkdir -p ${blddir}/arduino/MQTTClient/src
	cp $(ARDUINO_LIB_FILES) ${blddir}/arduino/MQTTClient/src
	cp $(LEGAL_FILES) ${blddir}/arduino/MQTTClient
	cp -R $(ARDUINO_SAMPLES) ${blddir}/arduino/MQTTClient/examples
	cd ${blddir}/arduino && zip -r arduino MQTTClient

endif



ifeq ($(OSTYPE),Darwin)

CC ?= /opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

ifndef INSTALL
INSTALL = install
endif
INSTALL_PROGRAM = $(INSTALL)
INSTALL_DATA =  $(INSTALL) -m 644

MAJOR_VERSION = 1
MINOR_VERSION = 0
VERSION = ${MAJOR_VERSION}.${MINOR_VERSION}

EMBED_MQTTLIB_C_TARGET = ${blddir}/lib${MQTT_EMBED_LIB_C}.so.${VERSION}


CCFLAGS_SO = -g -fPIC -Os -Wall -fvisibility=hidden -Wno-deprecated-declarations -DUSE_NAMED_SEMAPHORES
FLAGS_EXE = -I ${srcdir}  -L ${blddir}

LDFLAGS_C = -shared -Wl,-install_name,lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION}

all: build
	
build: | mkdir ${EMBED_MQTTLIB_C_TARGET} ${SYNC_SAMPLES} ${SYNC_TESTS}

clean:
	rm -rf ${blddir}/*
	
mkdir:
	-mkdir -p ${blddir}/samples
	-mkdir -p ${blddir}/test

${SYNC_TESTS}: ${blddir}/test/%: ${srcdir}/../test/%.c
	${CC} -g -o ${blddir}/test/${basename ${+F}} $< -l${MQTT_EMBED_LIB_C} ${FLAGS_EXE}

${SYNC_SAMPLES}: ${blddir}/samples/%: ${srcdir}/../samples/%.c
	${CC} -o ${blddir}/samples/${basename ${+F}} $< ${FLAGS_EXE} -l${MQTT_EMBED_LIB_C} 

${EMBED_MQTTLIB_C_TARGET}: ${SOURCE_FILES_C} ${HEADERS_C}
	${CC} ${CCFLAGS_SO} -o $@ ${SOURCE_FILES_C} ${LDFLAGS_C}
	-ln -s lib$(MQTT_EMBED_LIB_C).so.${VERSION}  ${blddir}/lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION}
	-ln -s lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION} ${blddir}/lib$(MQTT_EMBED_LIB_C).so


strip_options:
	$(eval INSTALL_OPTS := -s)

install-strip: build strip_options install

install: build 
	$(INSTALL_DATA) ${INSTALL_OPTS} ${EMBED_MQTTLIB_C_TARGET} $(DESTDIR)${libdir}

	/sbin/ldconfig $(DESTDIR)${libdir}
	ln -s lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so


uninstall:
	rm $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so.${VERSION}
	/sbin/ldconfig $(DESTDIR)${libdir}
	rm $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so


html:


endif

然后执行一下以下命令:

make

make install DESTDIR=/home/paho.mqtt.embedded-c-master prefix= 

#DESTDIR=/home/paho.mqtt.embedded-c-master,这里的设置好一个路径,会生成一个文件夹

就安装到了主机的/home/paho.mqtt.embedded-c-master目录下了,这个目录下会多出两个子目录:
1)、include,这个在我们编译自己的程序的时候需要用到;
2)、lib子目录,这个是我们编译自己的程序需要链接的一个动态库文件[libpaho-embed-mqtt3c.so.1.0],后期应用时把它复制到arm板根文件系统的/usr/lib中。
如果复制了还是报错,找不到libpaho-embed-mqtt3c.so.1.0的话,将工程根目录下的paho.mqtt.embedded-c/build/output目录下的三个so文件全部移植到arm板根文件系统的/usr/lib中,再把paho.mqtt.embedded-c/lib/libpaho-embed-mqtt3c.so.1.0复制过去
然后把这两个文件发到J5平台下,最好是放置到/userdata目录下,因为断电后文件不会消失,进入paho.mqtt.embedded-c-master/build/output/test下执行./test1,测试结果如下说明运行成功:

这里分享我编译好的两个文件,直接移动到J5平台下解压测试即可。

paho.mqtt.embedded-c-master.zip
paho.mqtt.zip

报错解决:


经排查,进入J5的/usr/lib目录中,执行:

rm libpaho-embed-mqtt3c.so
rm libpaho-embed-mqtt3c.so.1
#删除掉原来软连接文件
ln -s libpaho-embed-mqtt3c.so.1.0 libpaho-embed-mqtt3c.so.1
ln -s libpaho-embed-mqtt3c.so.1 libpaho-embed-mqtt3c.so
#重新创建软连接

在返回paho.mqtt.embedded-c-master/build/output/test下执行./test1,即可看到成功的结果:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在后续使用的时候,编写好程序后,直接调用头文件,确保lib库在系统库中(也就是/usr/lib),运行即可

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值