开机自启动的几种设置
树莓派软件打包发布
这里只演示如何在树莓派下打包Qt免安装程序带oepngl程序,程序名称为KeDeCJ6,后面遇到名字自行替换,大致步骤如下:
- 找个地方,比如桌面,创建空文件夹KeDeCJ6EXE,这个将用来存放KeDeCJ6程序的运行文件
- 先将工程使用Release模式编译,编译完后从目录把执行文件(带二进制文件KeDeCJ6)拷贝到KeDeCJ6EXE 我这里的文件夹名称是build-KeDeCJ6-Desktop_Qt_5_11_3_GCC_64bit-Release
- 在上一步的文件夹中(KeDeCJ6EXE)新建文件copylib.sh,通过指令设置权限
bashchmod 777 copylib.sh
- 在 copylib.sh 中加入内容
#!/bin/bash LibDir=$PWD"/lib" Target=$1 lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*")) $(mkdir $LibDir) for Variable in ${lib_array[@]} do cp "$Variable" $LibDir done
- 打开终端并进入到当前文件夹,输入
/copylib.sh KeDeCJ6
其中, KeDeCJ6 是运行copylib.sh 脚本的参数 大致意思就是通过 ldd 显示链接库文件并将库都复制放到当前目录的lib文件夹中。 - 进入QT的安装目录,找到platforms文件夹,我的路径是
/usr/lib/arm-linux-gnueabihf/qt5/plugins/platform
将整个platforms文件夹复制到KeDeCJ6EXE文件夹中,注意:这时复制的是整个文件夹,这使得KeDeCJ6EXE文件夹中会多出一个platforms文件夹 - 上文的copylib.sh放到KeDeCJ6EXE/platforms/中,并运行./copylib.sh libqxcb.so,这时会得到lib文件夹——libqxcb.so的库文件夹
- 将libqxcb.so的库文件夹中的所有文件复制KeDeCJ6EXE文件夹中,然后删除KeDeCJ6EXE/platforms/lib文件夹
- 在KeDeCJ6EXE文件夹中
sudo vim KeDeCJ6.sh
添加
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
- 执行
chmod 777 giptables.sh
到这里就基本完成了,不添加KeDeCJ6.sh 也行直接点击运行文件运行看是否能运行,如果正常运行,如果不能正常运行,将目录下所有的文件都修改下权限在尝试 。这时就可以打包到其他树莓派运行了
添加程序自启动
在树莓派上调试的时候都是通过ssh连接在控制台上命令启动,或者Qt编译完后直接运行启动这种方式适合测试和调试,程序弄好之后需要发布程序和设置开机启动,这样树莓派一上电就开始运行程序。查阅网上的资料,主要有三种方法,
一、/etc/rc.local添加启动项;
- 执行命令编辑rc.local文件
sudo vim /etc/rc.local
- 找到exit 0 上面一行添加语句
/home/pi/Desktop/KeDeCJ6EXE/KeDeCJ6 &
- 表示运行KeDeCJ6 文件 而& 符号可以简单理解为让程序运行在后台,然后执行sudo reboot 重启树莓派 尝试了多次,发现该方法并不能保证成功,用reboot 重启的话成功率还高点,断点重启的话基本都不行。此外,成功的时候如果输入
ps -ef | grep KeDeCJ6
来查看进程情况,笔者这边这个方法基本不行,暂时不知道原因 ,进程在,就是没有成功运行。。
二、~/.config/autostart下通过桌面启动应用
-
进入用户目录下的.config目录,里面如果没有autostart目录的话就新建一个
cd ~/.config/autostart
-
autostart目录下新建auto_start_test.desktop文件,编辑内容如下:
[Desktop Entry] Type="Application" Exec="/home/pi/Desktop/KeDeCJ6EXE/KeDeCJ6 &"
两种写法,有时候上面那个可以,有时候下面可以,但是下面成功率高,上面有可能搞错了
[Desktop Entry] Type=Application Name=KeDeCJ6 Exec=/home/pi/Desktop/KeDeCJ6EXE/KeDeCJ6 &
-
重启树莓派进行测试。这种方法一般是用于桌面应用的自启动,Qt就是属于这种桌面应用, 但听说这种启动不是每次都有效,我这边断电后有1-2次启动失败了。
三、是在/etc/init.d/中添加服务项。
- 执行
ls /etc/init.d
可以看到该目录下有很多服务程序文件 - 在这里添加自己的服务文件,就可以对其进行配置从而实现自启动,在该目录下新建文件
auto_start_test,cd /etc/init.d sudo vim auto_start_test
- 编辑内容:
#!/bin/bash ### BEGIN INIT INFO # Provides: Auto_Start_Test # Required-Start: $remote_fs # Required-Stop: $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Auto Start Test # Descrption: This service is used to test auto start service ### END INIT INFO case "$1" in start) echo "Stat" /home/pi/Desktop/KeDeCJ6EXE/KeDeCJ6 & ;; stop) echo "Stop" killall KeDeCJ6 exit 1 ;; *) echo "Usage:service Auto_Start_Test start|stop" exit 1 ;; esac exit 0
这是一个bash脚本,指定了用start和stop命令进行服务的启动和停止,“BEGIN INIT INFO”那段注释是LSB标准说明,写不写都行,不写的话后面会有个警告。保存文件 ,执行下面指令 。
sudo chmod 777 auto_start_test//开放权限
sudo update-rc.d auto_start_test//将该服务添加到自启动项
//手动启动服务来测试
sudo service auto_start_teststart//启动服务
sudo service auto_start_teststop//停止服务
重启树莓派查看效果,可以看到无法自行启动,查看服务是存在这个服务的,但是就是没有效果。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200325090312880.png
四、总结
脚本程序可以在自动启动窗口这一步之前运行,但是用户程序是不行。所以Qt打包完的程序因为是图形界面所以需要使用 ~/.config/autostart下通过桌面启动应用。感觉是应该需要启动界面来支持Qt的程序运行,不然窗口坐标怎么获取呢?