一,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 |