1 写在前面
正点原子的QT的文档教程里面,都是对出厂系统进行的开发的。但是博主自己是busybox创建的根文件系统,想自己移植一下QT,于是开始了两天的折腾。其实移植还是比较简单,一开始没有注意到用户手册里面有移植过程,然后就是自己的慢慢折腾。主要折腾的地方在ssh上面,博主想要在QT creator里面配置好全部,然后直接运行,开发板就可以显示UI。下面是过程和一些坑,因为博主是配置好后再写的blog,可能缺少一些问题的截图,但我尽力描述清除吧。
2 设置QT Creator
一开始选用的是没有移植QT,因为看到文档里面,都是对QT Creator里面进行配置,所有也没有多想,就直接按照教程开始了。因为都要设置QT Creator,所有先进行QT Creator设置吧。
2.1 配置QT Creator Kits
1 打开工具->选项:
打开QT Versions,点击添加版本名称为
xxx %{Qt:Version}
,xxx大家自己随意,然后qmake路径为/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/qmake
,如果是使用的正点原子的Ubuntu16的镜像,可以在相对应的目录找到,然后Apply保存。
2.打开编译器,添加c/c++编译器,
c文件的名称改为
xxx-GCC
。 路径为/opt/fsl-imx-x11/ 4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi -gcc
,c++文件名称改为
xxx-G++
。 路径为/opt/fsl-imx-x11/ 4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi -g++
。这里命名自己取,记住就行,后面需要用到,c文件的编译器最好还是加上,图片里面我没加。
3 配置Kits,首先点击ADD,名称随意,然后c/c++填入上面创建的,QT version也是自己创建的。图里面c/c++是因为在截图的时候,不小心全删了,又自己添加了。
4验证搭建的交叉编译kits,创建一个新的项目,然后在kits里面选择上我们自己创建的kits。
在 C++项处取消 ClangCodeModel 。
5 开始编译,点击构建,注意不要运行了,x86平台运行不了arm的。
然后验证编译出来的可执行文件,在项目目录下,找到build-demo-IMX6u-Debug,使用命令
file demo
,可以看到,是ARM平台下的。
2.2 远程部署QT项目
编译好的可执行程序拷贝到开发板上再执行 ,但是过于麻烦,所有可以远程部署。首先远程部署需要网络,可以不用联网,但是需要ping通Ubuntu。具体配置可以去看正点原子的视频教程。并且开发板需要openssh,但是无法联网,就需要自己移植openssh,这里就不过多介绍了,可以按照驱动开发手册里面的步骤来进行移植。这里也是卡的最久的一次,每次配置ssh都会出现莫名的错误。
1 现在开始配置运行设备,点击设备处,新建一个设备。 名称自己命名,IP地址就是自己开发板的ip地址,用户选项,先填写sshd,因为在移植的时候,就是创建的sshd。然后点击下一步。
这里需要创建一个密钥,因为需要免密登录,我这里由于部署老是错误,直接选择下一步了。
![]()
2.直接来到这个界面,可以看到,验证类型里面有两个,一个不需要公钥,一个需要,如果选择了不需要公钥,则会在后续报错,报错ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory,说明我们移植的ssh还是缺少东西的,但开发板无法连网,所以还是需要免密登录。
2.3 免密登录
在Device界面,我们可以看到一个Test和部署公钥选项,这里我们先创建新密钥,QT会在/home/user/.ssh里面创建两个文件。我们可以先进行部署公钥测试,如果不成功,可以打开终端,输入命令
ssh-copy-id ssh@192.168.10.50
,然后在进行部署公钥。然后进行test测试,测试界面会说我们的sftp server没有,这里,需要打开开发板,进入/usr/local/etc/sshd_config,修改我们的配置。修改自己的sftp-server路径。
1 Subssystem sftp /usr/local/libexec/sftp-server
博主这个修改完之后,但还是连接不上,用ubuntu的终端stfp连接,也不行,但是ssh却可以连接,当时在网上找了很久,但都是连不上。后面过了一天,我在进行测试,他就自己好了,很神奇。
sshd可以ssh登陆后,随后会出现无法访问/dev/null的情况,所以我们还是需要以root用户登录,这里可以看下面的问题汇总。
2.4 完成配置
上面2.3最后。我们测试一些test,如果成功的话,那么恭喜,可以少走一些弯路了。现在,我们创建好了device,现在我们就需要把这个加入到Kits。打开kits,Device type选择通用的Linux Device,然后在Device里面选择上我们创建好的device。
然后,在编译一下程序,记得在debug选项选择我们自己创建的kits,如果开发板屏幕出现一片白,说明就可以用了。
2.5 无sftp和rsync完成配置
博主的sftp一直不成功,而且也没有rsync,所以只能靠ssh和scp来救场了。正点原子的用户手册里面,I.MX6U 出厂系统 Qt 交叉编译环境搭建v1.7里面,没有介绍无sftp和rsync的远程调试,但是在v1.6版本里面却有。这操作挺迷的,毕竟基本上学到这,都是从内核,驱动,应用一步一步过来的,自己创建好了根文件系统,设备树,Linux和uboot,突然叫用出厂系统,还是不太想的。如果按照之前2.4,stfp能用的,可以跳过了。
下面开始操作,首先选择项目,点击run,这里我已经配置好了,按照原来的,会有一个通过SFTP上传文件,我们选择移除。然后在添加Deploy步骤,选择“Custom Process Step”。
添加 Command 为 ssh, Arguments:为
-p %{Device:SshPort} %{Device:UserName}@%{Device:H ostAddress} 'mkdir -p %{CurrentRun:Executable:Path}'
。 Working directory:默认为%{buildDir}。再添加一个 Custom Process Step ,
添加 Command 为 scp, Arguments:为
-P %{Device:SshPort} %{CurrentRun:Executable:FileName} %{Device:UserName}@%{Device:HostAddress}:%{CurrentRun:Executable:FilePath}
。 Working directory:默认为%{buildDir}。
返回到编辑,点击运行 ,可以看到已经运行成功了。注意这里需要进行root权限。root用户在下面问题汇总详细说。这里主要介绍过程。
3 不移植QT方法
博主一开始没有移植QT,按照上面的步骤一步一步搞完后,发现程序在运行的时候,会出现。而且还会缺少很多的库。
1
2 This application failed to start because it could not find or load the Qt platform plugin "linuxfb"
in "".这里就需要自己移植这些库文件了。我们一步一步来,首先,我们在opt/demo/bin目录下创建一个platforms文件夹,这里以为我们没有设置环节变量,就需要保持platforms和可执行文件在=同一个文件夹下。然后在ubuntu里面,找到qt的文件夹,然后将/qtbase/plugins/platform里面的文件复制到opt/demo/bin/platforms,这里要注意,不要使用ubuntu里面opt文件夹下的platform内的,如果用file命令看一下的话,这些文件都是x86平台下的,我们需要的是arm平台下的。
然后是补齐所需要的库文件,这里我们可以执行一下文件,他会告诉我们缺少的库,然后,我们去ubuntu下。使用
1 find / -name XXXX.so.x一个一个查找,然后进行复制操作,这些文件我们主要放在开发板的/lib文件夹下面。
这个方法比较麻烦,所以建议自己移植QT,然后创建环境变量,一劳永逸。
4 移植QT
这部分就不说了,用户手册里面有完整的移植过程。比我写的详细。
5.错误汇总
5.1 QTCreator设备测试无SFTP service
如果按照驱动开发手册里面移植的ssh的话,sftp-server实在/usr/local/libexce里面,所以sshd_config里面就需要修改为目标目录。
5.2 ssh无法root用户登录
QT Creator里面device里面,我们必须要用root用户登录,不然会在第一步/dev/null就卡住,原因是因为sshd用户无权限,前面我们选择sshd,是为了测试一下是否能够正常连接。
这里首先是查看sshd_config配置文件,吧PermitRootLogin 改为yes。
busybox创建的根文件系统,我们是不知道root密码的,我们可以在ubuntu里面,使用
1 ssh root@192.168.10.50发现,无论输入什么密码都无法连接。root密码保存在/etc/shadow里面,可以看到下面的root后面就是密码,不过是加密过后的。
如果之前未修改密码,root后面:里面就是空的,但就是ssh连接不上,可以使用
1 passwd root
将密码改为自己想要的,这里建议改为0就行了,改为空密码总是出现问题。
然后在ubuntu里面进行ssh root@ip ,就会出现输入登陆密码,就会登陆进去,我们使用ssh-copy-id 之后,发现可以成功,但是在QT Creator里面的device里面,点击测试,发现还是连接不上,这时如果再去终端里面ssh连接root用户,发现还是要输入密码。经过一番查询,是root用户目录下的.ssh文件的权限问题。按照下面修改权限:
1
2
3
4
5
6
7
8
9
10
11 # 确保 /root 目录权限正确
chmod 700 /root
chown root:root /root
# 修复 .ssh 目录权限
chmod 700 /root/.ssh
chown root:root /root/.ssh
# 修复 authorized_keys 文件权限
chmod 600 /root/.ssh/authorized_keys
chown root:root /root/.ssh/authorized_keys然后重复上面的ssh-copy-id就行了。
如果连接不上,可以查看一下root/.ssh/au… 的密钥文件内容是否与ubuntu下的/home/user/.ssh/qtc_id.pub内容是否一致。
当时博主在这里卡了很久,因为使用的是sshd用户登录,但会出现很多错误。试过很多种方案,比如修改/dev/null的权限,但是治标不治本,重启之后/dev/null的权限就会变,可以开机就修改权限,问题解决了,但是又出现无法访问/dev/fb0,当时想者这得修改多少权限,遂止。然后又去修改sshd,把sshd改为root用户,导致ubuntu直接ssh不上sshd用户了,越改错误越多,折腾好久才把root用户弄好。
5.3 QT Creator出现permission denied
这里主要就是未使用root用户来连接,导致没有权限。需要切换root用户。
5.4 出现 ‘/opt/demo/bin/platforms/libqlinuxfb.so’ is an invalid ELF object (wrong cpu architecture)
可以看到, Qt 程序在尝试加载平台插件(
libqlinuxfb.so
)时失败了,因为这个.so
文件的 CPU 架构与你的系统架构不匹配。这里就需要下载QT源码,Index of /archive/qt/5.12/5.12.9/single,然后解压编译,具体编译过程在移植QT里面有写到。