苦心研究了几天交叉编译环境的安装,因为工作需要,要在一个arm系统上运行程序,正常已经搭配好环境了,见此贴,后来改为SDK的方式更好使用,但是SDK的方式对环境要求特别要,生成的动态库so文件必须与目标机一致,稍有版本不同则会报错,qt版本不同会报错,gcc版本不同会报错,glibc版本高了会报错,总之各种不兼容,必须要求各版本一致,本文主要意指就是为了概述一下安装指定版本的交叉编译环境所需要的过程,自己记录,分享大家。
提供一些下载网站,所有安装包均使用离线下载包形式,不涉及在线下载,除非系统配置缺失
根据环境,也能知道在Ubuntu中搭建交叉编译环境主要就是gcc交叉编译链、glibc以及qt
参考1:麒麟V10编译安装GCC9.3
参考2:aarch64-linux-gnu_交叉编译工具链
参考3:Linux环境中安装指定版本的gcc-aarch64-linux-gnu
概述:
在Ubuntu界面的终端查询gcc一般都是系统自带的gcc,架构为x86_64,不可用于交叉编译在arm中运行,所以我们需要安装aarch64-linux-gnu,当选好指定版本的gcc后下载离线包,在下载相应的工具包,有的工具包需要安装,安装工具包参照参考方式,有的不需要安装工具包,直接将工具包放在自定目录,再使用qt配置相关gcc和g++环境即可,有的只需要将arm中的gcc文件夹复制过来也可以直接使用,一般为/usr/lib/gcc/aarch64-linux-gnu文件夹,在配置好环境之后想要通过终端查看版本,需要修改etc/profile文件,在最后几行加入以下代码,#为我其他编译器注释掉的
#export PATH=$PATH:/root/workspace/allwinner/OK3399/host/bin
#export PATH=$PATH:/root/workspace/allwinner/OK3399/gcc9/bin
export PATH=$PATH:/root/workspace/allwinner/OK3399/3399/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin
此时可以使用source profile即可使环境变量生效,无需重启
查看使用aarch64-linux-gnu-gcc -v
下面是32位系统a40i为例
路径下为已经配置好交叉编译器
/root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin
查看当前环境变量命令:echo $PATH
修改etc/profile环境变量
export PATH=$PATH:/root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin
执行命令source /etc/profile
验证编译器是否安装成功,执行命令:arm-linux-gnueabihf-g++ -v
概述:
查看当前交叉编译libc或libm版本命令,进入到文件路径下执行命令:strings libm.so.6 | grep GLIBC
glibc的安装方式可以通过install的方式安装指定版本,也可以直接将arm中的glibc路径文件拷贝过来,一般为lib/aarch64-linux-gnu文件,拷贝之后软连接全部消失,重新设置软连接当前系统交叉编译使用的libc和新拷贝的libc-2.xx.so版本
暂未搞明白怎么设置交叉编译器指引指定路径的linc.so.6
软连接libc命令:ln -s /root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib2.27/libc-2.27.so /root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib/libc.so.6
软连接libm命令:ln -s /root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib2.27/libm-2.27.so /root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib/libm.so.6
参考1:qt5在linux下搭建交叉编译环境
概述:
下载目标板的qt版本,按照参考1安装,也可以将开发板的qt安装后文件包复制过来使用,安装之后在ubuntu的qt添加配置gcc和g++,在配置qmake.conf,一般在qt源码的qtbase/mkspace/xxx/下面
xxx为需要交叉编译文件夹,如3399 aarch64的选择linux-aarch64-gnu-g++文件夹,a40i 32位选择linux-arm-gnueabi-g++文件夹
参考1中重点为修改qmake.conf文件,下面为a40i为例和3399为例
A40i,交叉编译器arm-linux-gnueabihf-g++
#
# qmake configuration for building with arm-linux-gnueabihf-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX = /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-g++
QMAKE_LINK = /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-g++
QMAKE_CFLAGS +=-mfpu=neon -marm -mcpu=cortex-a7
QMAKE_CXXFLAGS +=-mfpu=neon -marm -mcpu=cortex-a7
# modifications to linux.conf
QMAKE_AR = /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM = /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP = /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-strip
QMAKE_INCDIR_OPENGL_ES2 +=$$AW_LICHEE_ROOT/tools/pack/chips/sun8iw11p1/hal/gpu/fbdev/include
QMAKE_LIBDIR_OPENGL_ES2 +=$$AW_LICHEE_ROOT/tools/pack/chips/sun8iw11p1/hal/gpu/fbdev/lib
QMAKE_LIBS_OPENGL_ES2 += -lGLESv2
load(qt_config)
RK3399,交叉编译器aarch64-linux-gnu-g++
#
# qmake configuration for building with aarch64-linux-gnu-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = /root/workspace/allwinner/OK3399/3399/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
QMAKE_CXX = /root/workspace/allwinner/OK3399/3399/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK = /root/workspace/allwinner/OK3399/3399/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = /root/workspace/allwinner/OK3399/3399/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
# modifications to linux.conf
QMAKE_AR = /root/workspace/allwinner/OK3399/3399/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = /root/workspace/allwinner/OK3399/3399/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-objcopy
QMAKE_NM = /root/workspace/allwinner/OK3399/3399/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-nm -P
QMAKE_STRIP = /root/workspace/allwinner/OK3399/3399/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip
load(qt_config)
在最后使用时,使用qt配置GCC和G++决定用的是某一版本的aarch64-linux-gnu-gcc,不论在编译qt源码时使用的是什么交叉编译器GCC,qt编译出来的程序版本决定于qt配置的GCC和G++
参考1中第4步创建auto.sh文件说明:
-prefix为选择编译后文件路径,看自己心情放在哪里,我习惯放在源码下创建一个单独的文件夹buildqt5.9.0
-xplatform linux-aarch64-gnu-g++为交叉编译相关选择,这个不是写交叉编译器,而是上面的xxx文件夹选择(这里我就是填错总写交叉编译器,一直报错,要注意是qmake.conf文件夹名称)
#!/bin/sh
./configure \
-prefix /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/buildroot-201611/dl/qt-everywhere-opensource-src-5.9.0/buildqt5.9.0 \
-confirm-license \
-opensource \
-release \
-make libs \
-xplatform linux-arm-gnueabi-g++ \
-pch \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-dbus \
-no-xcb \
-no-separate-debug-info
之后sudo make和sudo make install
make错误参照此贴注释程序
安装完成后,我们在buildqt5.9.0安装目录中有相应文件出现,表示编译成功。
GCC交叉编译链可以在qt中切换选择
glibc版本只能每次固定设置,指定某个路径后,想要更换glibc版本就要重新软连接
qt版本只要编译好后,也是可以切换选择
欢迎各位大佬点评哪里写的不对,如果不对立即修改,谢谢