qt移植到讯为rk3568,包含一些错误总结
qt移植到arm报错动态库找不到
error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory
通过设置环境变量 LD_LIBRARY_PATH就行了。
LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环境变量。
例如:
前提:所有用到的文件包括库文件都在你程序目录下。
①在你程序目录下创建一个脚本文件test.sh
②编辑test.sh
export ARM_DIR=`pwd`
export APP_DIR=`pwd`
export LD_LIBRARY_PATH=$ARM_DIR/lib#lib是你的程序文件夹里面的库文件夹,名字根据自己的修改
$APP_DIR/exe(exe:你的arm程序)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在讯为给的资料中,一个是 etc/profile配置文件中,配置了
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
if [ "$PS1" ]; then
if [ "`id -u`" -eq 0 ]; then
export PS1='[\u@\h:\w]# '
else
export PS1='[\u@\h:\w]$ '
fi
fi
export PAGER='/bin/more '
export EDITOR='/bin/vi'
# Source configuration files from /etc/profile.d
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
. $i
fi
unset i
done
export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:
export LS_COLORS
resize
/*添加下面两种不同的 /etc/profile内容时,屏幕界面不正常显示,出来个格子界面,Mobaxter的串口通信界面显示堆栈错误*/
经过逐行排查 ,是倒数第三行的问题
# 设置Qt平台为linuxfb,并指定帧缓冲设备为/dev/fb0
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
可以
-
指定正确的图形平台:
如果您的系统使用的是 X11,您应该设置QT_QPA_PLATFORM
为xcb
:export QT_QPA_PLATFORM=xcb
如果您的系统使用的是 Wayland,则应该设置为
wayland
:export QT_QPA_PLATFORM=wayland
请根据您的系统配置选择正确的平台。
Wayland是显示服务器与客户端通信的协议库。Weston是Wayland的参考实现,提供完整环境及测试程序。
2. 杠掉,会自动用默认的
# 设置核心转储文件大小为0,并将标准输出和标准错误重定向到/dev/null,即丢弃所有输出
ulimit -S -c 0 > /dev/null 2>&1
# 获取当前用户的用户名,并将其存储在USER变量中
USER="`id -un`"
# 将LOGNAME变量设置为与USER变量相同的值
LOGNAME=$USER
# 设置PS1环境变量,定义命令行提示符的格式
# 这里的格式是:[用户名@主机名]:当前工作目录#
PS1='[$USER@$HOSTNAME]:$PWD# '
# 将PATH环境变量设置为其当前值(这里实际上是多余的,因为后面没有改变PATH的值)
PATH=$PATH
# 获取主机名,并将其存储在HOSTNAME变量中
HOSTNAME=`/bin/hostname`
# 导出USER, LOGNAME, PS1, PATH, HOSTNAME变量,使它们在当前shell会话及其子进程中可用
export USER LOGNAME PS1 PATH HOSTNAME
# 从/proc/bus/input/devices文件中查找包含'ft5x06'或'goodix-gt911'的行及其后4行
# 然后从这些行中提取第95个字符之前的字符串(实际上是取倒数第5到第10个字符,因为tail -n1取的是最后一行)
# 最后,使用cut命令从第13到第18个字符之间提取事件设备名称,存储在EVENT变量中
EVENT=$(cat /proc/bus/input/devices | grep -E 'ft5x06|goodix-gt911' -A4 | tail -n1 | head -c 95 | cut -c13-18)
# 设置tslib的根目录环境变量
export TSLIB_ROOT=/qt/opt/tslib1.4
# 设置Qt的根目录环境变量
export QT_ROOT=/qt/opt/qt5.15.2
# 设置触摸屏输入设备的环境变量,使用之前从/proc/bus/input/devices中提取的EVENT变量
export TSLIB_TSDEVICE=/dev/input/$EVENT
# 设置触摸屏事件类型的环境变量
export TSLIB_TSEVENTTYPE=input
# 设置tslib配置文件的环境变量
export TSLIB_CONFFILE=/qt/opt/tslib1.4/etc/ts.conf
# 设置tslib插件目录的环境变量
export TSLIB_PLUGINDIR=/qt/opt/tslib1.4/lib/ts
# 设置控制台设备为none,表示不使用控制台设备
export TSLIB_CONSOLEDEVICE=none
# 设置帧缓冲设备为/dev/fb0
export TSLIB_FBDEVICE=/dev/fb0
# 设置LD_PRELOAD环境变量,预加载tslib的库文件
export LD_PRELOAD=$TSLIB_ROOT/lib/libts.so
# 设置Qt的鼠标协议为tslib,并使用之前提取的EVENT变量指定输入设备
export QWS_MOUSE_PROTO=tslib:/dev/input/$EVENT
# 设置LD_LIBRARY_PATH环境变量,包含多个库目录,确保运行时能找到所需的库文件
export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_ROOT/lib:$TSLIB_ROOT/lib:$TSLIB_ROOT/lib/
# 设置Qt平台插件目录的环境变量
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
# 设置Qt平台为linuxfb,并指定帧缓冲设备为/dev/fb0
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
# 设置Qt字体目录的环境变量
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts
# 设置Qt使用的通用插件为tslib
export QT_QPA_GENERIC_PLUGINS=tslib
export PATH PS1 OPIEDIR QPEDIR QTDIR EDITOR TERM
#放入的tslib目录
export TS_ROOT=/usr/local/tslib
export LD_LIBRARY_PATH=$TS_ROOT/lib:$LD_LIBRARY_PATH
export PATH=$TS_ROOT/bin:$PATH
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=$TS_ROOT/etc/pointercal
export TSLIB_CONFFILE=$TS_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TS_ROOT/lib/ts
# qt
# 放入的qt目录
export QT_ROOT=/usr/local/qt
export LD_LIBRARY_PATH=$QT_ROOT/lib/:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts
export QT_QPA_GENERIC_PLUGINS=tslib
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:inverty
export QT_QPA_FB_TSLIB=1
export LD_PRELOAD=$TS_ROOT/lib/libts.so
报错
[root@topeet:/qt/opt]# ./tslib1.4/bin/ts_calibrate
fopen: No such file or directory
Couldnt load module linear
ts_config: No such file or directory
ts_setup: No such file or directory
解决
将 ts.conf中的module linear那行直接注释掉即可
设置横屏
查看显示屏名称
使用 ls /sys/class/drm/ 命令查看显示屏名称,如下图所示,
可知我这里用的是DSI屏,DSI-1就是屏幕的名称。另外还有HDMI屏等。
修改weston.ini配置文件
编辑 /etc/xdg/weston/weston.ini文件,在文件末尾增加以下语句,随后保存重启即可。
[output]
name=HDMI-A-1 //设备名称
transform=90 //旋转角度为90度
我这里设置以后,重启,屏幕卡在kernel界面进不了桌面
参考文档,使用
echo "output:all:rotate90" > /tmp/.weston_drm.conf # 所有屏幕旋转90度
解决。
至于原因,参考设备树设置。官方文档或者其他博客都有介绍。
buildroot添加桌面应用
添加桌面应用需要准备三个文件:
桌面图标文件、xxx.desktop文件、可执行应用文件
矢量图
阿里巴巴矢量图网站进行下载,图标的尺寸为128x128
https://www.iconfont.cn/
xx.desktop文件
[Desktop Entry]
Name=Touch # 应用名称
Exec=/usr/bin/Touch # 执行命令
Icon=/usr/share/icon/ico_touch.png # 图标路径
Type=Application # 类型:应用程序
//我用的是
[Desktop Entry]
Name=Usart # 应用名称
Exec=/qt/opt/untitled2 # 执行命令
Icon=/usr/share/icon/sdw.png # 图标路径
Type=Application # 类型:应用程序
可执行应用文件
交叉编译得到的 qt可执行程序。
开发板上的准备
图标文件放到 /usr/share/icon
应用程序 随便放,可以是 /usr/bin
配置文件 .desktop放到 /usr/share/applications
然后重启开发板,就可以看到效果
可执行程序开机自启动
1. 使用init.d脚本
对于使用Linux系统的RK3568开发板,可以通过在/etc/init.d/目录下添加一个自启动脚本,并设置其权限和启动顺序来实现开机自启动。
步骤:
创建脚本:在/etc/init.d/目录下创建一个新的脚本文件,例如mystartup.sh。
编辑脚本:在脚本文件中添加启动你的可执行程序的命令。例如:
#!/bin/sh # 使用sh解释器执行此脚本
/usr/bin/myexecutable & # 在后台启动myexecutable程序
确保将/usr/bin/myexecutable替换为你的可执行程序的实际路径。
重新加载systemd配置:使用systemctl daemon-reload命令重新加载systemd配置。
启用服务:使用systemctl enable mystartup.service命令启用服务,使其在开机时自动启动。
2. 修改rcS文件(针对Buildroot系统)
如果你的RK3568开发板使用的是Buildroot构建的系统,并且根文件系统是基于BusyBox的,你可以直接在/etc/init.d/rcS文件中添加启动命令。
步骤:
编辑rcS文件:使用文本编辑器打开/etc/init.d/rcS文件。
添加启动命令:在文件的末尾或其他合适的位置添加启动你的可执行程序的命令。例如
/usr/bin/myexecutable &