初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
这是操作记录。
移远的某款5G平台,arm64,简化版linux系统。交叉编译环境为ubuntu18(我用的是最小安装的live server)。
交叉编译工具:unisoc-initgc-glibc-x86_64-unisoc-console-image-aarch64-toolchain-udx710-module+unisoc-initgc-1.0+20201024+userdebug+native.sh和environment-setup-aarch64-unisoc-linux,如果用的不是这两个就不用往下看了。
安装好之后的C++编译工具叫做aarch64-unisoc-linux-g++。
目录
一、工具安装
二、理解交叉编译
三、各种问题
3.1 找不到crt*.o
3.2 链接libc.so和libpthread.so出错
四、各种库的交叉编译
4.1 交叉编译zilb
4.2 交叉编译openssl
4.3 交叉编译mosquitto
上传unisoc-initgc-glibc-x86_64-unisoc-console-image-aarch64-toolchain-udx710-module+unisoc-initgc-1.0+20201024+userdebug+native.sh
注意必须是二进制,上传之后执行,安装到默认位置或者输入指定位置,最终输出大致如下:
You are about to install the SDK to "/opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native". Proceed[Y/n]? y
Extracting SDK..........................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
$ . /opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/environment-setup-aarch64-unisoc-linux
每次编译需要先执行如下命令:
source environment-setup-aarch64-unisoc-linux
注意这个文件必须用文本模式上传。
编译的时候会报找不到一些.o错误,用find找一下,在交叉编译工具的某个位置能找到,设法通过参数解决,实在不行复制过去用。
这两个是文本格式的文件,里面指向了真正的文件,里面依赖的文件使用了绝对路径,而这个绝对路径是错误的,删掉目录,只保留文件名即可(里面有多个依赖项,每个都要修改)。
这两个是我发现的,或许还有更多同样的问题。
为了修改这两个文件,需要设置权限,要从/opt开始设置,一直到最后:
cd /
sudo chmod 777 /opt
cd opt
sudo chmod 777 unisoc-initgc
cd unisoc-initgc
sudo chmod 777 udx710-module+unisoc-initgc-1.0+20201024+userdebug+native
cd udx710-module+unisoc-initgc-1.0+20201024+userdebug+native
sudo chmod 777 sysroots
cd sysroots
sudo chmod 777 aarch64-unisoc-linux
cd aarch64-unisoc-linux
sudo chmod 777 usr
cd usr
sudo chmod 777 lib
cd lib
sudo chmod 777 *.so
这个比较简单,与正常本地编译并没有什么区别:
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/home/user/zlib_install
make
make install
因为我们是交叉编译,所以一定要指定安装位置,不能默认安装(会破坏系统)。
这个过程会有些麻烦,在折腾过的机子上可能问题比较多,之前我在用了很久的虚拟机上尝试再次编译竟然失败了(编译好了一直在用),现在用全新安装的虚拟机却比较顺利:
tar zxvf openssl-1.1.1k.tar.gz
cd openssl-1.1.1k
./config no-asm -shared --prefix=/home/user/openssl_install (生成Makefile,里面的编译指令已经是交叉编译的)
make (如果提示-m64问题,从Makefile中删掉,共两处)
make install
config命令会生成Makefile,如果make报错,提示-m64问题,搜索Makefile,删掉两处-m64即可。
这个是依赖openssl的,所以必须先编译好openssl。
先解压缩安装包:
tar -zxvf mosquitto-2.0.18.tar.gz
cd mosquitto-2.0.18
修改config.mk,在# End of user configuration后面增加下列内容:
CC=aarch64-unisoc-linux-gcc
CXX=aarch64-unisoc-linux-g++
LDFLAGS+= -L/home/user/openssl_install/lib/ -lssl -lcrypto -ldl -lpthread
LDFLAGS+= -L/opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/
LDFLAGS+= -L/opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/aarch64-unisoc-linux/7.2.1/
LDFLAGS+= -L/opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/lib/
CPPFLAGS+= -I/opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/include/c++/7.2.1/
CPPFLAGS+= -I/opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/include/c++/7.2.1/aarch64-unisoc-linux/
CPPFLAGS+= -I/opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/include/
CPPFLAGS+= -I/home/user/
继续在config.mk找到这个改成no,带cjson没法编译过去
WITH_CJSON:=no
然后可以尝试编译:
export DESTDIR=/home/user/mosquitto_install/
make
make install
在make那步就会遇到很多问题,按照下面的指示操作:
找不到openssl的头文件:
export C_INCLUDE_PATH=/home/user/openssl-1.1.1k/include/
找不到更多头文件:
export C_INCLUDE_PATH=/home/user/openssl-1.1.1k/include/:/opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/include/
这句似乎不能解决找不到.o问题
export LDFLAGS="-L/opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/ -L/opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/aarch64-unisoc-linux/7.2.1/"
遇到找不到.o的(修改TARGET,因为很多,统一复制到一个目录再复制到每个目录):
TARGET=~/gateway5g/
cp /opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/crt1.o $TARGET
cp /opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/crti.o $TARGET
cp /opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/aarch64-unisoc-linux/7.2.1/crtbegin.o $TARGET
cp /opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/aarch64-unisoc-linux/7.2.1/crtend.o $TARGET
cp /opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/aarch64-unisoc-linux/7.2.1/crtendS.o $TARGET
cp /opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/aarch64-unisoc-linux/7.2.1/crtbeginS.o $TARGET
cp /opt/unisoc-initgc/udx710-module+unisoc-initgc-1.0+20201024+userdebug+native/sysroots/aarch64-unisoc-linux/usr/lib/crtn.o $TARGET
cp ~/gateway5g/*.o ./lib/
cp ~/gateway5g/*.o ./lib/cpp/
cp ~/gateway5g/*.o ./apps/db_dump/
cp ~/gateway5g/*.o ./apps/mosquitto_passwd/
cp ~/gateway5g/*.o ./client/
cp ~/gateway5g/*.o ./plugins/auth-by-ip/
cp ~/gateway5g/*.o ./plugins/deny-protocol-version/
cp ~/gateway5g/*.o ./plugins/message-timestamp/
cp ~/gateway5g/*.o ./plugins/payload-modification/
cp ~/gateway5g/*.o ./src/
这样应该就差不多。
(这里是文档结束)