抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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 打开工具->选项:

image-20250416150520824打开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保存。

image-20250415221400356

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文件的编译器最好还是加上,图片里面我没加。

image-20250415221727397

3 配置Kits,首先点击ADD,名称随意,然后c/c++填入上面创建的,QT version也是自己创建的。图里面c/c++是因为在截图的时候,不小心全删了,又自己添加了。

image-20250415222817617

4验证搭建的交叉编译kits,创建一个新的项目,然后在kits里面选择上我们自己创建的kits。

image-20250415223141477

在 C++项处取消 ClangCodeModel 。

image-20250415223419297

5 开始编译,点击构建,注意不要运行了,x86平台运行不了arm的。

image-20250415223813476

然后验证编译出来的可执行文件,在项目目录下,找到build-demo-IMX6u-Debug,使用命令file demo,可以看到,是ARM平台下的。

image-20250415224428050

2.2 远程部署QT项目

编译好的可执行程序拷贝到开发板上再执行 ,但是过于麻烦,所有可以远程部署。首先远程部署需要网络,可以不用联网,但是需要ping通Ubuntu。具体配置可以去看正点原子的视频教程。并且开发板需要openssh,但是无法联网,就需要自己移植openssh,这里就不过多介绍了,可以按照驱动开发手册里面的步骤来进行移植。这里也是卡的最久的一次,每次配置ssh都会出现莫名的错误。

1 现在开始配置运行设备,点击设备处,新建一个设备。 名称自己命名,IP地址就是自己开发板的ip地址,用户选项,先填写sshd,因为在移植的时候,就是创建的sshd。然后点击下一步。

image-20250415225513319

这里需要创建一个密钥,因为需要免密登录,我这里由于部署老是错误,直接选择下一步了。

image-20250415225801764

2.直接来到这个界面,可以看到,验证类型里面有两个,一个不需要公钥,一个需要,如果选择了不需要公钥,则会在后续报错,报错ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory,说明我们移植的ssh还是缺少东西的,但开发板无法连网,所以还是需要免密登录。

image-20250415225348250

image-20250415230506696

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

image-20250416111638225

博主这个修改完之后,但还是连接不上,用ubuntu的终端stfp连接,也不行,但是ssh却可以连接,当时在网上找了很久,但都是连不上。后面过了一天,我在进行测试,他就自己好了,很神奇。

sshd可以ssh登陆后,随后会出现无法访问/dev/null的情况,所以我们还是需要以root用户登录,这里可以看下面的问题汇总

2.4 完成配置

上面2.3最后。我们测试一些test,如果成功的话,那么恭喜,可以少走一些弯路了。现在,我们创建好了device,现在我们就需要把这个加入到Kits。打开kits,Device type选择通用的Linux Device,然后在Device里面选择上我们创建好的device。

image-20250416111314472

然后,在编译一下程序,记得在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}。

image-20250416114921978

返回到编辑,点击运行 ,可以看到已经运行成功了。注意这里需要进行root权限。root用户在下面问题汇总详细说。这里主要介绍过程。

image-20250416115241471

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。

image-20250416122925646

busybox创建的根文件系统,我们是不知道root密码的,我们可以在ubuntu里面,使用

1
ssh root@192.168.10.50

发现,无论输入什么密码都无法连接。root密码保存在/etc/shadow里面,可以看到下面的root后面就是密码,不过是加密过后的。

image-20250416143134326

如果之前未修改密码,root后面:里面就是空的,但就是ssh连接不上,可以使用

1
passwd root

image-20250416144602223

将密码改为自己想要的,这里建议改为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里面有写到。

评论