山高疑日近,海阔觉天低

Ubuntu20.04搭建Qt交叉编译环境

一,Ubuntu20.04 安装
注意安装的时候首先选择”随后安装” /boot的最小为500MB
1、apt配置
#代理配置
cat /etc/apt/apt.conf.d/proxy.conf

echo 'Acquire::http::proxy "socks5h://10.0.0.249:1085";'>/etc/apt/apt.conf.d/proxy.conf

Ubuntu20.04 sourcelist
vim  /etc/apt/sources.list
#官方

deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://archive.canonical.com/ubuntu focal partner
deb-src http://archive.canonical.com/ubuntu focal partner

2、允许root登录
/etc/gdm3/custom.conf

AllowRoot=true
AutomaticLoginEnable=True
AutomaticLogin=root

/etc/pam.d/gdm-password and put # in front of the line containing:

#auth required pam_succeed_if.so user != root quiet_succes

/etc/ssh/sshd_config

PermitRootLogin yes
PasswordAuthentication yes

3、常用工具安装
open-vm-tools-desktop open-vm-tools 好像不需要了
openssh-server:ssh
build-essential:开发环境
libxcb-xinerama0:qt需要
copyq:内核编译需要
libglu1-mesa-dev freeglut3-dev mesa-common-dev:qt opengl需要
libsqlite3-dev:sqlite3.so需要
sshpass: ssh脚本直接输入用户密码

apt install openssh-server vim wget net-tools  build-essential lrzsz libxcb-xinerama0 tree copyq

光盘vmtool卸载

/usr/bin/vmware-uninstall-tools.pl
rm -rvf /usr/lib/vmware-tools
apt autoremove open-vm-tools --purge

4、Samba共享

apt install samba
mkdir /samba
chmod 777 /samba
systemctl enable smbd
systemctl start smbd
[VM share] 
  comment = Users profiles 
  path = /samba 
  guest ok = yes 
  writable = yes 
  public =yes 
  create mask = 0666 
  directory mask = 0777

5、Nfs共享

apt install nfs-kernel-server nfs-common
echo "/samba *(rw,sync,no_root_squash)" >>/etc/exports
systemctl enable nfs-kernel-server
/etc/init.d/nfs-kernel-server restart
showmount -e
judge "mount -t nfs -o nolock,nfsvers=3 192.168.1.251:/home/samba /opt/nfs"

6、减少日志文件大小
/var/log/journal  有时候会占用很大空间,运行一下命令瘦身

journalctl --vacuum-size=10M

7、Snap 删除

apt autoremove --purge snapd

Snap 删除 后网卡不正常,如果碰到netplan apply 不好用,不妨试下ifconfig  {网卡名字}  {IP} netmask  255.255.255.0 试试
以及正常的Ubuntu配置网卡同时支持DHCP与静态ip双IP配置,注意修改网卡名称,如下示例是ens33
cat /etc/netplan/01-network-manager-all.yaml

# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: yes
      dhcp6: no
      nameservers:
        addresses: [219.146.0.130,219.146.0.130,192.168.1.1]
      addresses: [192.168.10.102/24]

电脑端双ip配置,将下面文件保存成*.bat文件

set InterfaceName="мн╠Ф═Э"
set IPAddress="192.168.10.110"
set IPAddressMask="255.255.255.0"
netsh interface ipv4 set interface interface=%InterfaceName% dhcpstaticipcoexistence=enabled
netsh interface ipv4 add address %InterfaceName% %IPAddress% %IPAddressMask%
pause

8、安装Google拼音
qtCreator谷歌拼音支持插件

sudo apt install fcitx-googlepinyin
im-config //设置为fcitx
init 6
apt install fcitx-googlepinyin
然后在setting设置语言为英语

9、禁用ssh登录验证
在/etc/ssh/ssh_config下面添加如下配置信息

  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null

10,开启主机与Ubuntu文件共享
vmhgfs-fuse是一个命令行工具,它是VMware为Linux系统提供的open-vm-tools软件包的一部分。这个工具用于挂载VMware共享文件夹,使得在虚拟机(例如Ubuntu系统)和宿主机(例如Windows系统)之间共享文件成为可能。在这个命令中,vmhgfs是VMware Host-Guest File System(VMware宿主-客户文件系统)的缩写,fuse则是Filesystem in Userspace(用户空间文件系统)的缩写。fuse是一种允许非特权用户创建自己的文件系统的接口。

#vmware设置里设置共享文件夹hgfs
sudo mkdir -p /mnt/hgfs
sudo vmhgfs-fuse .host:/hgfs /mnt/hgfs -o allow_other 
#修改fstab开机自动挂载
.host:/hgfs /mnt/hgfs fuse.vmhgfs-fuse allow_other,uid=1000,gid=1000,defaults 0 0

二,Qt配置
1、Qt 5.12 交叉编译器安装
注意!!!如果没有安装build-essential等会出现:
qmake无法编译

参考 :正点原子IMX6ULL(精校)/资料/开发板(A盘)-基础资料/10、用户手册/【正点原子】I.MX6U%20出厂系统Qt交叉编译环境搭建V1.6.pdf

2、Qt 5.12

参考 :正点原子IMX6ULL(精校)/资料/开发板(A盘)-基础资料/10、用户手册/【正点原子】I.MX6U%20出厂系统Qt交叉编译环境搭建V1.6.pdf
注意安装qt的时候如果安装源码会非常浪费时间和硬盘空间
如果qtcreator启动失败,提示:qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
安装依赖库apt install --reinstall libxcb-xinerama0

3、QtCreator

在qtcreator.sh增加一行:
/opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

4,QtCreator配置

参考资料:
开发板(A盘)-基础资料/10、用户手册/【正点原子】I.MX6U%20出厂系统Qt交叉编译环境搭建V1.6.pdf

三,VSCode
Vscode详细配置

安装:
https://code.visualstudio.com/docs/setup/linux  找到dep文件
apt install ./code_1.67.2-1652812855_amd64.deb
配置:
开发板(A盘)-基础资料/09、文档教程(非常重要)/【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf  4.51章节

四,交叉编译环境
1、交叉编译命名
一般来说,交叉编译工具链的命名规则为:arch-core-kernel-system-language。其中:
arch:体系架构,如ARM,MIPS等,表示该编译器用于哪个目标平台;
core:使用的是哪个CPU Core,如Cortex A8;或者是指定工具链的供应商。可以留空不填。这一组命名比较灵活,在某些厂家提供的交叉编译链中,有以厂家名称命名的,也有以开发板命名的,或者直接是none或cross的;
kernel: 所运行的OS,见过的有Linux,uclinux,bare(无OS);
system:交叉编译链所选择的库函数和目标映像的规范,如gnu,gnueabi,gnueabihf等。其中gnu等价于glibc+oabi;gnueabi等价于glibc+eabi。若不指定,则也可以留空不填,gnueabihf标识CPU支持浮点运算
language:编译语言,表示该编译器用于编译何种语言,最常见的就是gcc,g++
其实gnueabi与gnueabihf只不过是gcc的选项-mfloat-abi的默认值不同。gcc的选项-mfloat-abi有三种值soft、softfp、hard(其中后两者都要求arm里有fpu浮点运算单元,soft与后两者是兼容的,但softfp和hard两种模式互不兼容):
参考原文
2、交叉编译环境介绍
同一个芯片,交叉编译环境都可能不一样,下面时整点原子提供的交叉编译器目录结构,主要有4个目录:
①Ubuntu本身GCC编译器,
这个没啥好说的,通常安装到/opt/Qtx.x.x,仅安装QtCreator也是可以的
②Ubuntu交叉编译编译器环境
存放X86格式的编译器,以及Qt工具,rcc,ui,uic,moc等等,这些是程序编译工具,必须是在Ubuntu能够使用的,存放目录:/opt/fsl-imx-x11/qt5.6.1/sysroots/x86_64-pokysdk-linux

environment-setup.d \\在执行设置交叉编译环境脚本的时候会执行里面的qt5.sh脚本,作用是交叉编译用TARGET_SYSROOT的Qt 环境进行编译,NATIVE_SYSROOT的qt库,头文件根本没用
etc \\经测试该文件夹可以删除
var \\经测试该文件夹可以删除
sbin \\经测试该文件夹可以删除
lib \\该文件夹不可删除,删除后qmake会失败提示 找不到路径
user \\存放交叉编译器以及qmake目录不可删除,猜测qmake可能需要某些依赖库在这里面
user\include \\经测试该文件夹可以删除
user\lib \\不可删除虽然编译不需要,但是猜测qmake可能需要某些依赖库在这里面

③Ubuntu交叉编译编译链接环境
存放Arm格式的库文件,交叉编译器在编译的是在Arm中能够运行的程序,链接的库文件也是Arm格式的库,这个文件夹就是存放Arm下的库环境,其文件系统是嵌入式的子集:/opt/fsl-imx-x11/qt5.6.1/sysroots/cortexa7hf-neon-poky-linux-gnueabi

④嵌入式Flash中Qt库,注意在Flash只存在Qt的库文件
如果②>④会发生问题:stylesheet不管用
编译时提示:确少LibGLS.so,原因根据经验有2个:没有调用source /etc/profile;Qt 的so库文件编译时候指定的是使用ELGLFS plugin
注意以上是正点原子给的交叉编译环境搭建结果,其实各家开发板给的可能不太一样,①④基本没有区别,主要是②③区别比较大!!!!
MH用的交叉编译器环境不太一样,在Ubuntu上主要有2个文件夹
②Ubuntu交叉编译编译器环境以及Ubuntu交叉编译编译链接环境
/opt/zlg_arm_linux/

tree -L 1 //opt/zlg_arm_linux/
├──arm-linux-gnueabihf
├────bin
├────debug-root
├────include //存放头文件
├────lib //存放Arm库文件
├────libc //存放Arm交叉库文件 这个貌似是sysroot
├     ├──etc
├     ├──lib
├     ├──sbin
├     ├──usr
│        ├── bin
│        ├── include //存放大量头文件
│        ├── lib/arm-linux-gnueabihf //存放大量Arm库文件
│        ├── libexec
│        ├── sbin
│        └── share
├────── var
├──bin  //存放交叉编译器
├──lib
├──libexec
└──share

③qt环境,/qt5.5.1

lib \\存放少部分库文件
user\lib \\交叉编译链接Arm库文件的主要目录,库文件主要地点,包括qt库
user\include \\交叉编译器识别的Include目录,包括qt以及stdio等等
user\bin\qt5  \\qt5在arm环境下的某些bin文件如qtcreator,qtdesign等等,这些都是X86格式的
user\lib\qt5\mkspec  \\QMAKESPEC的取值范围,qmake生成MakeFile,根据不同的系统生成的Makefile不同!!!其中的linux-oe-g++表示OpenEmbedded环境下g++;arm下不需要
user\lib\qt5\plugins \\插件目录,其实就是一些库文件,例如libqlinuxfb.so,elgfs等等

注意经测试可以直接配置user\lib\qt5\mkspec,让他支持交叉编译,比如自己配置的linux-zlg/qmake.conf:

lee@MRZ:/opt/zlg_arm_linux$ cat /opt/qt5.5.1/mkspecs/linux-zlg/qmake.conf 
#
# qmake configuration for linux-g++ with modifications for building with OpenEmbedded
#
# Variables
CROSS_COMPILE_ROOT = /opt/zlg_arm_linux/bin
CC=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-gcc
CXX=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-g++
GDB=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-gdb
STRIP=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-strip
RANLIB=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-ranlib
OBJCOPY=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-objcopy
OBJDUMP=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-objdump
AR=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-ar
NM=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-nm
MY_CFLAGS_RELEASE = "-O3 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard"
MY_CFLAGS_DEBUG = "-O0 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard"
MY_LDFLAGS = "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"

THE_QT_ROOT="/opt/qt5.5.1"
MY_QMAKE_QT_CONFIG=$${THE_QT_ROOT}/mkspecs/qconfig.pri


MAKEFILE_GENERATOR	= UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)

# QMAKE_ (moc, uic, rcc) are gone, overwrite only ar and strip
QMAKE_AR              = $${AR} cqs
QMAKE_STRIP           = $${STRIP}
QMAKE_WAYLAND_SCANNER = $${OE_QMAKE_WAYLAND_SCANNER}

include(../common/gcc-base-unix.conf)

# *FLAGS from gcc-base.conf
QMAKE_LFLAGS += $${MY_LDFLAGS}
QMAKE_CFLAGS_DEBUG += $${MY_CFLAGS_DEBUG}
QMAKE_CXXFLAGS_DEBUG += $${MY_CFLAGS_DEBUG}
QMAKE_CFLAGS_RELEASE += $${MY_CFLAGS_RELEASE}
QMAKE_CXXFLAGS_RELEASE += $${MY_CFLAGS_RELEASE}

include(../common/g++-unix.conf)

# tc settings from g++-base.conf
QMAKE_COMPILER = $(OE_QMAKE_COMPILER) gcc

QMAKE_CC       = $${CC}
QMAKE_CXX      = $${CXX}

QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $${MY_CFLAGS_RELEASE}

QMAKE_LINK         = $${CXX}
QMAKE_LINK_SHLIB   = $${CXX}
QMAKE_LINK_C       = $${CXX}
QMAKE_LINK_C_SHLIB = $${CXX}

# for the SDK
isEmpty(QMAKE_QT_CONFIG):QMAKE_QT_CONFIG = $${MY_QMAKE_QT_CONFIG}

#include(../oe-device-extra.pri)


IMX6_CFLAGS             = -DLINUX=1
QMAKE_LIBS_EGL         += -lEGL
QMAKE_LIBS_OPENGL_ES2  += -lGLESv2 -lEGL
QMAKE_LIBS_OPENVG      += -lOpenVG -lEGL
QMAKE_CFLAGS_RELEASE   += $$IMX6_CFLAGS
QMAKE_CXXFLAGS_RELEASE += $$IMX6_CFLAGS
QMAKE_CFLAGS_DEBUG   += $$IMX6_CFLAGS
QMAKE_CXXFLAGS_DEBUG += $$IMX6_CFLAGS

load(qt_config)

五,关于linaro交叉编译介绍
Linaro官网
正点原子其实也用了他的编译器版本是4.9.4,正点原子魔改了它在<驱动开发指南V1.6.pdf>第4.3章简单的介绍了Linaro
zlg和SSD都是用了Linaro的交叉编译器,没有魔改所以目录结构和官网的一致,交叉编译器不仅可以编译Qt程序,也可以编译U-boot以及内核,也不能一味升级交叉编译器版本,正点原子发现如果用7.3编译器,U-boot不能启动,下面是Linaro交叉编译器目录结构

lee@MRZ:/samba$ tree -d -L 3 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
├── arm-linux-gnueabihf
│   ├── bin
│   ├── include
│   │   └── c++   //编译器默认C++库*.h头文件目录
│   ├── lib       //编译器默认C++库*.so 如libstdc++.so.6.0就在这里
│   │   ├── debug
│   │   └── ldscripts
│   └── libc     //编译器默认的-sysroot目录,里面含有C库
│       ├── etc
│       ├── lib
│       ├── sbin
│       ├── usr  //编译器默认的-sysroot目录
│       │   ├── bin
│       │   ├── include  //编译器*.h头文件寻找主要路径,<linux><sys><stdio>等等都在这里
│       │   ├── lib      //编译器*.so库文件寻找主要路径
│       │   ├── libexec
│       │   ├── sbin
│       │   └── share
│       └── var
├── bin         //存放交叉编译器bin文件
├── include
│   └── gdb
├── lib
│   └── gcc
│       └── arm-linux-gnueabihf
├── libexec
│   └── gcc
│       └── arm-linux-gnueabihf
└── share
    ├──

经过测试发现里面不含arm的bin文件如ls,cd等等,编译器有默认的选项,经过测试编译器是通过相对路径自己添加头文件的搜索路径,以及lib库文件的搜索路径,可以通过arm-linux-gnueabihf-gcc  -print-sysroot 获取默认sysroot,-print-search-dirs获取默认搜索路径
从Linaro获取到的交叉编译器是不能编译Qt程序的,怎样才能够编译Qt程序?
很简单:用下载到的编译器编译Qt库文件,获得的Qt目录如下:

lee@MRZ:/opt$ tree -L 1    qt5.5.1
qt5.5.1
├── bin  //X86构架  存放uic,moc,rcc,qmake预处理文件
├── doc
├── imports
├── include  //存放Qt头文件
├── lib      //存放Qt库文件 arm构架
├── mkspecs  //存放qmake 的mkspec
├── plugins
├── qml
└── translations

将生成的库文件存放于lib下就可以了,QtCreator在配置Kit的时候注意设置qmake目录,以及mkspec万事大吉了

在编译的时候qmake会自动添加qt的头文件路径,以及lib链接路径到Makefile中

QtCreator kit 配置中的Qt mkspec

首先要明白编译过程:
qmake->makefile
qmake怎么知道makefile如何编写?答案就在Qt mkspec配置中!!该选项会指定一个mkspec配置选项文件夹名字,默认是在qt安装目录/mkspecs下,里面有很多配置,每个配置下有2个文件:qmake.conf qplatformdefs.h
qmake.conf


具体某个变量所表达的意义 我猜想qmake每次生成Makefile的时候都会导入类似QMAKE_CC等的值,然后根据这些常量值生成makefile,简单解释一些关键的变量:

QMAKE_CC :.c文件的编译器,典型值 arm-linux-gnueabihf-gcc
QMAKE_CXX :.cpp文件的编译器,典型值 arm-linux-gnueabihf-g++
QMAKE_CFLAGS,QMAKE_CXXFLAGS:分别是上面2个编译器的编译选项,典型值 -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard
这些值好像在环境变量不能直接设置,根据正点原子资料都是用一个OE_前缀,在环境中定义,定义环境变量脚本:set_env如下:

export SDKTARGETSYSROOT=/opt/fsl-imx-x11/qt5.6.1/sysroots/cortexa7hf-neon-poky-linux-gnueabi
export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"
export OECORE_NATIVE_SYSROOT="/opt/fsl-imx-x11/qt5.6.1/sysroots/x86_64-pokysdk-linux"
export PATH=$OECORE_NATIVE_SYSROOT/usr/bin:$OECORE_NATIVE_SYSROOT/usr/sbin:$OECORE_NATIVE_SYSROOT/bin:$OECORE_NATIVE_SYSROOT/sbin:$OECORE_NATIVE_SYSROOT/usr/bin/../x86_64-pokysdk-linux/bin:$OECORE_NATIVE_SYSROOT/usr/bin/arm-poky-linux-gnueabi:$OECORE_NATIVE_SYSROOT/usr/bin/arm-poky-linux-uclibc:$OECORE_NATIVE_SYSROOT/usr/bin/arm-poky-linux-musl:$PATH
export CCACHE_PATH=$OECORE_NATIVE_SYSROOT/usr/bin:$OECORE_NATIVE_SYSROOT/usr/bin/../x86_64-pokysdk-linux/bin:$OECORE_NATIVE_SYSROOT/usr/bin/arm-poky-linux-gnueabi:$OECORE_NATIVE_SYSROOT/usr/bin/arm-poky-linux-uclibc:$OECORE_NATIVE_SYSROOT/usr/bin/arm-poky-linux-musl:$CCACHE_PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
export CONFIG_SITE=/opt/fsl-imx-x11/qt5.6.1/site-config-cortexa7hf-neon-poky-linux-gnueabi

export OECORE_ACLOCAL_OPTS="-I /opt/fsl-imx-x11/qt5.6.1/sysroots/x86_64-pokysdk-linux/usr/share/aclocal"
unset command_not_found_handle
export CC="arm-poky-linux-gnueabi-gcc  -march=armv7ve -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
export CXX="arm-poky-linux-gnueabi-g++  -march=armv7ve -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
export CPP="arm-poky-linux-gnueabi-gcc -E  -march=armv7ve -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
export AS="arm-poky-linux-gnueabi-as "
export LD="arm-poky-linux-gnueabi-ld  --sysroot=$SDKTARGETSYSROOT"
export GDB=arm-poky-linux-gnueabi-gdb
export STRIP=arm-poky-linux-gnueabi-strip
export RANLIB=arm-poky-linux-gnueabi-ranlib
export OBJCOPY=arm-poky-linux-gnueabi-objcopy
export OBJDUMP=arm-poky-linux-gnueabi-objdump
export AR=arm-poky-linux-gnueabi-ar
export NM=arm-poky-linux-gnueabi-nm
export M4=m4
export TARGET_PREFIX=arm-poky-linux-gnueabi-
export CONFIGURE_FLAGS="--target=arm-poky-linux-gnueabi --host=arm-poky-linux-gnueabi --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
export OECORE_DISTRO_VERSION="4.1.15-2.1.0"
export OECORE_SDK_VERSION="4.1.15-2.1.0"
export ARCH=arm
export CROSS_COMPILE=arm-poky-linux-gnueabi-

export THE_QT_ROOT_BIN="/opt/fsl-imx-x11/qt5.6.1/sysroots/x86_64-pokysdk-linux/usr/bin/qt5"
export PATH=$THE_QT_ROOT_BIN:$PATH
export OE_QMAKE_CFLAGS="$CFLAGS"
export OE_QMAKE_CXXFLAGS="$CXXFLAGS"
export OE_QMAKE_LDFLAGS="$LDFLAGS"
export OE_QMAKE_CC=$CC
export OE_QMAKE_CXX=$CXX
export OE_QMAKE_LINK=$CXX
export OE_QMAKE_AR=$AR
export QT_CONF_PATH=$THE_QT_ROOT_BIN/qt.conf
export OE_QMAKE_LIBDIR_QT=`qmake -query QT_INSTALL_LIBS`
export OE_QMAKE_INCDIR_QT=`qmake -query QT_INSTALL_HEADERS`
export OE_QMAKE_MOC=$THE_QT_ROOT_BIN/moc
export OE_QMAKE_UIC=$THE_QT_ROOT_BIN/uic
export OE_QMAKE_RCC=$THE_QT_ROOT_BIN/rcc
export OE_QMAKE_QDBUSCPP2XML=$THE_QT_ROOT_BIN/qdbuscpp2xml
export OE_QMAKE_QDBUSXML2CPP=$THE_QT_ROOT_BIN/qdbusxml2cpp
export OE_QMAKE_QT_CONFIG=`qmake -query QT_INSTALL_LIBS`/qt5/mkspecs/qconfig.pri
export OE_QMAKE_PATH_HOST_BINS=$THE_QT_ROOT_BIN
export QMAKESPEC=`qmake -query QT_INSTALL_LIBS`/qt5/mkspecs/linux-oe-g++
export OE_QMAKE_STRIP=$STRIP

2022,12.1 发现可以不用set_env,直接修改mkspecs下的qmake.conf

#
# qmake configuration for linux-g++ with modifications for building with OpenEmbedded
#
# Variables 参考下面链接
#https://doc.qt.io/qt-6/qmake-language.html#variables
# 注意 $${} 用于变量   $$() 用于环境变量
CROSS_COMPILE_ROOT = /opt/zlg_arm_linux/bin
CC=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-gcc
CXX=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-g++
GDB=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-gdb
STRIP=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-strip
RANLIB=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-ranlib
OBJCOPY=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-objcopy
OBJDUMP=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-objdump
AR=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-ar
NM=$${CROSS_COMPILE_ROOT}/arm-linux-gnueabihf-nm
MY_CFLAGS_RELEASE = "-O3 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard"
MY_CFLAGS_DEBUG = "-O0 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard"
MY_LDFLAGS = "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"

THE_QT_ROOT="/opt/qt5.5.1"
MY_QMAKE_QT_CONFIG=$${THE_QT_ROOT}/mkspecs/qconfig.pri


MAKEFILE_GENERATOR	= UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)

# QMAKE_ (moc, uic, rcc) are gone, overwrite only ar and strip
QMAKE_AR              = $${AR} cqs
QMAKE_STRIP           = $${STRIP}
QMAKE_WAYLAND_SCANNER = $${OE_QMAKE_WAYLAND_SCANNER}

include(../common/gcc-base-unix.conf)

# *FLAGS from gcc-base.conf
QMAKE_LFLAGS += $${MY_LDFLAGS}
QMAKE_CFLAGS_DEBUG += $${MY_CFLAGS_DEBUG}
QMAKE_CXXFLAGS_DEBUG += $${MY_CFLAGS_DEBUG}
QMAKE_CFLAGS_RELEASE += $${MY_CFLAGS_RELEASE}
QMAKE_CXXFLAGS_RELEASE += $${MY_CFLAGS_RELEASE}

include(../common/g++-unix.conf)

# tc settings from g++-base.conf
QMAKE_COMPILER = $(OE_QMAKE_COMPILER) gcc

QMAKE_CC       = $${CC}
QMAKE_CXX      = $${CXX}

QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $${MY_CFLAGS_RELEASE}

QMAKE_LINK         = $${CXX}
QMAKE_LINK_SHLIB   = $${CXX}
QMAKE_LINK_C       = $${CXX}
QMAKE_LINK_C_SHLIB = $${CXX}

# for the SDK
isEmpty(QMAKE_QT_CONFIG):QMAKE_QT_CONFIG = $${MY_QMAKE_QT_CONFIG}

#include(../oe-device-extra.pri)

IMX6_CFLAGS             = -DLINUX=1
QMAKE_LIBS_EGL         += -lEGL
QMAKE_LIBS_OPENGL_ES2  += -lGLESv2 -lEGL
QMAKE_LIBS_OPENVG      += -lOpenVG -lEGL
QMAKE_CFLAGS_RELEASE   += $$IMX6_CFLAGS
QMAKE_CXXFLAGS_RELEASE += $$IMX6_CFLAGS
QMAKE_CFLAGS_DEBUG   += $$IMX6_CFLAGS
QMAKE_CXXFLAGS_DEBUG += $$IMX6_CFLAGS

load(qt_config)

注意 $${} 用于变量 $$() 用于环境变量

qplatformdefs.h 主要作用是预先Include一些C库,unstd.h等

经过测试发现mkspec的优先级高于在Qtcreator的kits设置设置GCC/G++编译器,换句话说如果在mkspec中设置了一些常量就会覆盖掉QTCreator的设置

makefile->app
其实阅读生成的Makefile之后,就能知道这个工程会用那个编译器去编译,用什么编译参数去编译,不难理解

 

另外拷贝了同事的qt后在QtCreator配置提示:qt没有正确安装,然后我用strings命令查看qmake的时候发现QT_INSTALL_PREFIX等变量竟然与是同时电脑的配置,解决方式是在bin目录下创建qt.conf写入一下内容:

[Paths]
Prefix= ..
      • 周立功板子

周立功开发板子在线帮助

另外我发现一个问题,整点原子编译器都设定了–sysroot=$SDKTARGETSYSROOT,意思是让编译器去$SDKTARGETSYSROOT这个目录找头文件和进行.so库连接,单周立功的没有指定这个参数这让我比较困惑,在执行

./arm-linux-gnueabihf-g++ -print-sysroot
/opt/zlg_arm_linux/bin/../arm-linux-gnueabihf/libc

./arm-linux-gnueabihf-g++ -print-file-name=libstdc++.so.6.0.20
/opt/zlg_arm_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/lib/libstdc++.so.6.0.20

./arm-linux-gnueabihf-g++ -print-search-dirs //显示搜索目录
install:
$INSTALLROOT/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/
programs:
$INSTALLROOT/bin/../libexec/gcc/arm-linux-gnueabihf/4.9.2/
:$INSTALLROOT/bin/../libexec/gcc/arm-linux-gnueabihf/
:$INSTALLROOT/bin/../libexec/gcc/
:$INSTALLROOT/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/bin/arm-linux-gnueabihf/4.9.2/
:$INSTALLROOT/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/bin/arm-linux-gnueabihf/
:$INSTALLROOT/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/bin/
libraries
: =$INSTALLROOT/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/
:$INSTALLROOT/bin/../lib/gcc/arm-linux-gnueabihf/
:$INSTALLROOT/bin/../lib/gcc/
:$INSTALLROOT/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/lib/arm-linux-gnueabihf/4.9.2/
:$INSTALLROOT/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/lib/arm-linux-gnueabihf/
:$INSTALLROOT/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/lib/=$INSTALLROOT/arm-linux-gnueabihf/lib
:$INSTALLROOT/bin/../arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf/4.9.2/
:$INSTALLROOT/bin/../arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf/
:$INSTALLROOT/bin/../arm-linux-gnueabihf/libc/lib/
:$INSTALLROOT/bin/../arm-linux-gnueabihf/libc/usr/lib/arm-linux-gnueabihf/4.9.2/
:$INSTALLROOT/bin/../arm-linux-gnueabihf/libc/usr/lib/arm-linux-gnueabihf/
:$INSTALLROOT/bin/../arm-linux-gnueabihf/libc/usr/lib/

明白了吧?编译器内置一个默认的sysroot,这就不难理解了,同时发现有些库不在sysroot下,正点原子编译器的sysroot是指向一个非法值,所以要求我们在CXXFLAGS时加入”–sysroot”配置,否侧
,会在Ubuntu自己的文件系统去Include与链接.
同时发现编译器内置了搜索路径如上:$INSTALLROOT/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/lib/=$INSTALLROOT/arm-linux-gnueabihf/lib这个目录恰好是arm版本C库的位置

还需要安装额外的依赖包

sudo apt-get install ia32-libs
sudo apt-get install libc6:i386 libstdc++6:i386 libncurses5:i386 zlib1g:i386

周立功arm与nxp  对应型号

产品名称 M6G2C-128LI M6G2C-256LI M6G2C-512F512LI-T M6G2C-512F4GLI-T
处理器 NXP i.MX6UL NXP i.MX6UL NXP i.MX6UL NXP i.MX6UL
赞(0) 打赏
未经允许不得转载:Mr.Zhang » Ubuntu20.04搭建Qt交叉编译环境

你的打赏是我的动力

登录

找回密码

注册