移远5G平台交叉编译C++、OpenSSL

初级代码游戏的专栏介绍与文章目录-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

        注意这个文件必须用文本模式上传。

二、理解交叉编译

  • 交叉编译工具是专门的,命令的可执行文件都和本地命令不同,要么名字不同,要么位置不同
  • 编译依赖的头文件和库文件是不一样的,头文件或许可以共享,库文件格式一定是不同的,本地安装的库不可能用在交叉编译上,所以各种库都要用交叉编译工具重新编译
  • 编译出的程序肯定不能在本地运行,能正确编译也未必能在目标环境下运行,目标环境下可能缺少库、也可能库版本不正确,交叉编译用的库和目标环境的库必须一致

三、各种问题

3.1 找不到crt*.o

        编译的时候会报找不到一些.o错误,用find找一下,在交叉编译工具的某个位置能找到,设法通过参数解决,实在不行复制过去用。

3.2 链接libc.so和libpthread.so出错

        这两个是文本格式的文件,里面指向了真正的文件,里面依赖的文件使用了绝对路径,而这个绝对路径是错误的,删掉目录,只保留文件名即可(里面有多个依赖项,每个都要修改)。

        这两个是我发现的,或许还有更多同样的问题。

        为了修改这两个文件,需要设置权限,要从/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

四、各种库的交叉编译

4.1 交叉编译zilb

        这个比较简单,与正常本地编译并没有什么区别:

tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/home/user/zlib_install
make
make install

        因为我们是交叉编译,所以一定要指定安装位置,不能默认安装(会破坏系统)。

4.2 交叉编译openssl

        这个过程会有些麻烦,在折腾过的机子上可能问题比较多,之前我在用了很久的虚拟机上尝试再次编译竟然失败了(编译好了一直在用),现在用全新安装的虚拟机却比较顺利:

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即可。

4.3 交叉编译mosquitto

        这个是依赖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/

        这样应该就差不多。


(这里是文档结束)

你可能感兴趣的:(工业,5G,交叉编译,openssl)