某4G平台交叉编译C++、modbus、mosquitto(MQTT)

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


目录

一、交叉编译工具链

二、编译libmodbus_rtu_over_tcp

三、编译mosquitto(MQTT客户端) 


一、交叉编译工具链

        这个交叉编译工具链是arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz,如果不是就不用往下看了。(这个环境自带OpenSSL,因此不需要额外交叉编译)

        这个用法很简单:

mkdir -p /opt/FriendlyARM/toolchain
tar xf arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz -C /opt/FriendlyARM/toolchain/

export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin:$PATH

验证
arm-linux-gcc -v

        我用的环境是Ubuntu18(用户名user,后面上传压缩包都是在用户的根目录),以上几个指令的输出如下:

user@vm-ubuntu:~$ mkdir -p /opt/FriendlyARM/toolchain
user@vm-ubuntu:~$ tar xf arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz -C /opt/FriendlyARM/toolchain/
user@vm-ubuntu:~$ export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin:$PATH
user@vm-ubuntu:~$ arm-linux-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gcc
COLLECT_LTO_WRAPPER=/opt/FriendlyARM/toolchain/4.9.3/libexec/gcc/arm-cortexa9-linux-gnueabihf/4.9.3/lto-wrapper
Target: arm-cortexa9-linux-gnueabihf
Configured with: /work/toolchain/build/src/gcc-4.9.3/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=arm-cortexa9-linux-gnueabihf --prefix=/opt/FriendlyARM/toolchain/4.9.3 --with-sysroot=/opt/FriendlyARM/toolchain/4.9.3/arm-cortexa9-linux-gnueabihf/sys-root --enable-languages=c,c++ --with-arch=armv7-a --with-tune=cortex-a9 --with-fpu=vfpv3 --with-float=hard --with-pkgversion=ctng-1.21.0-229g-FA --with-bugurl=http://www.friendlyarm.com/ --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --with-gmp=/work/toolchain/build/arm-cortexa9-linux-gnueabihf/buildtools --with-mpfr=/work/toolchain/build/arm-cortexa9-linux-gnueabihf/buildtools --with-mpc=/work/toolchain/build/arm-cortexa9-linux-gnueabihf/buildtools --with-isl=/work/toolchain/build/arm-cortexa9-linux-gnueabihf/buildtools --with-cloog=/work/toolchain/build/arm-cortexa9-linux-gnueabihf/buildtools --with-libelf=/work/toolchain/build/arm-cortexa9-linux-gnueabihf/buildtools --enable-lto --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-gold --disable-multilib --with-local-prefix=/opt/FriendlyARM/toolchain/4.9.3/arm-cortexa9-linux-gnueabihf/sys-root --enable-long-long
Thread model: posix
gcc version 4.9.3 (ctng-1.21.0-229g-FA)

        根据后面编译程序时的提示看到链接工具所在的位置是/opt/FriendlyARM/toolchain/4.9.3/lib/gcc/arm-cortexa9-linux-gnueabihf/4.9.3/../../../../arm-cortexa9-linux-gnueabihf/bin/,我们可以看一下都有些什么:

user@vm-ubuntu:~/my/gateway$ ls -l /opt/FriendlyARM/toolchain/4.9.3/lib/gcc/arm-cortexa9-linux-gnueabihf/4.9.3/../../../../arm-cortexa9-linux-gnueabihf/bin/
total 12312
-r-xr-xr-x 2 user user  779160 Nov 14  2015 ar
-r-xr-xr-x 2 user user 1352408 Nov 14  2015 as
-r-xr-xr-x 1 user user     143 Nov 14  2015 ld
-r-xr-xr-x 2 user user 1243512 Nov 14  2015 ld.bfd
-r-xr-xr-x 2 user user 4588904 Nov 14  2015 ld.gold
-r-xr-xr-x 2 user user  763536 Nov 14  2015 nm
-r-xr-xr-x 2 user user  938448 Nov 14  2015 objcopy
-r-xr-xr-x 2 user user 1193264 Nov 14  2015 objdump
-r-xr-xr-x 2 user user  779160 Nov 14  2015 ranlib
-r-xr-xr-x 2 user user  938480 Nov 14  2015 strip

        strip也有的,这个可以用来删除二进制文件里面的多于信息,极大地减小文件大小。

        确认了arm-linux-gcc正确就可以编译C/C++代码了,makefile里面写gcc/g++的直接替换掉就可以了,使用环境变量的修改环境变量。

二、编译libmodbus_rtu_over_tcp

        这个库支持rtu_over_tcp,比原版更常用。

        编译过程按照下面的操作应该没什么问题:

unzip libmodbus_rtu_over_tcp-master.zip
cd libmodbus_rtu_over_tcp-master
chmod 755 *.sh
./autogen.sh
如果没有安装autoconif则 sudo apt-get install autoconf libtool 再重新./autogen.sh
./configure --host=arm-cortexa9-linux-gnueabihf  --prefix=/home/user/arm32/libmodbus_rtu_over_tcp_install  CC=arm-linux-gcc
make install
检查文件是否是"ELF 32-bit LSB shared object, ARM":
file /home/user/arm32/libmodbus_rtu_over_tcp_install/lib/*

        注意./configure使用了参数指明目标环境和安装位置,安装位置可以按需要修改。

        最后一个命令显示了lib下的文件格式:

user@vm-ubuntu:~/libmodbus_rtu_over_tcp-master$ file /home/user/arm32/libmodbus_rtu_over_tcp_install/lib/*
/home/user/arm32/libmodbus_rtu_over_tcp_install/lib/libmodbus.la:       libtool library file, ASCII text
/home/user/arm32/libmodbus_rtu_over_tcp_install/lib/libmodbus.so:       symbolic link to libmodbus.so.5.1.0
/home/user/arm32/libmodbus_rtu_over_tcp_install/lib/libmodbus.so.5:     symbolic link to libmodbus.so.5.1.0
/home/user/arm32/libmodbus_rtu_over_tcp_install/lib/libmodbus.so.5.1.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=b13c3010824896b60601712385d320c51c2f377c, with debug_info, not stripped
/home/user/arm32/libmodbus_rtu_over_tcp_install/lib/pkgconfig:          directory

        “ELF 32-bit LSB shared object, ARM”,这说明确实是arm32格式的。

三、编译mosquitto(MQTT客户端) 

        按照如下指示操作应该会很顺利:

tar zxvf mosquitto-2.0.18.tar.gz
cd mosquitto-2.0.18
export DESTDIR=/home/user/arm32/mosquitto_install/

修改config.mk
在# End of user configuration后面增加
CC=arm-linux-gcc
CXX=arm-linux-g++
找到
# Build mosquitto_sub with cJSON support
WITH_CJSON:=yes
修改为no


make
make install
file /home/user/arm32/mosquitto_install/usr/local/lib/*

         注意,中间那段是手工修改文件。DESTDIR是安装位置,可以根据需要修改。

        最后一个命令是显示输出结果的文件类型:

user@vm-ubuntu:~/mosquitto-2.0.18$ file /home/user/arm32/mosquitto_install/usr/local/lib/*
/home/user/arm32/mosquitto_install/usr/local/lib/libmosquittopp.so:   symbolic link to libmosquittopp.so.1
/home/user/arm32/mosquitto_install/usr/local/lib/libmosquittopp.so.1: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=4202b37ae4ea422d4c20026cc8c3e3330b519c31, with debug_info, not stripped
/home/user/arm32/mosquitto_install/usr/local/lib/libmosquitto.so:     symbolic link to libmosquitto.so.1
/home/user/arm32/mosquitto_install/usr/local/lib/libmosquitto.so.1:   ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=fdfbc709fda279488513a16a7c07ab9304f860c8, with debug_info, not stripped
/home/user/arm32/mosquitto_install/usr/local/lib/pkgconfig:           directory

        如果已经做过别的类型的编译,要首先执行“make clean”,不然编译那一步会误以为不需要重新编译,从而什么都不做。


(这里是文档结束)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初级代码游戏

知识究竟是有价还是无价

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值