第一章:树莓派Ubuntu23.04系统汉化及安装qt5.15.10
兴奋不已的重头戏,他来啦!权限权限,Ubuntu系统最恶心的一点在这两个部分体现的淋漓尽致,两台同样的机子,同样的代码,结果却不同。这里我会总结两个机子上出现的各种问题来分析,并提出我的最终解决办法。
一.程序打包
我用的这个是树莓派,是ARM架构的,和X86有着质的区别,所以能用在X86上的一些自动打包工具,在这上面是用不了的,虽然ARM也有一些自动打包的工具,但我这里推荐手动打包。
首先qt用release构建,不用debug,虽然debug也可以打包,稍微说一下debug和relase的异同。
Debug 打包
优点:
- 调试信息丰富:包含详细的调试符号,便于开发者定位和修复代码中的问题。
- 断言和调试检查:通常包含断言和各种调试检查,有助于在开发阶段捕捉潜在的错误和异常。
- 易于调试:由于代码没有被优化,变量值和控制流更容易与源代码对应,方便单步调试和代码分析。
缺点:
- 性能较差:因为没有进行优化,代码执行速度较慢,内存占用也可能较高。
- 文件体积较大:包含调试符号和额外的调试信息,导致生成的可执行文件和库文件较大。
- 安全性低:调试信息可能包含敏感数据和代码实现细节,不适合公开发布。
Release 打包
优点:
- 性能优化:编译器会对代码进行各种优化,如内联函数、删除无用代码等,使得程序运行速度更快,内存占用更少。
- 文件体积小:去除了调试信息和不必要的代码,生成的可执行文件和库文件更小。
- 安全性高:调试符号被移除,增加了反向工程和代码分析的难度,更适合公开发布和生产环境。
缺点:
- 调试困难:由于缺少调试信息,单步调试和定位问题变得更加困难,可以说根本进不了断点(偷偷说一句,曾因为忘记了一直处于release编译模式下导致进不了断点而怀疑是我代码出了问题,折腾了半天)。
- 断言和检查移除:为了性能,许多断言和调试检查在Release模式中被移除,可能隐藏一些潜在的问题。
- 优化导致的不一致:某些优化可能导致代码行为与未优化时有所不同,增加了调试的复杂性。
闲话说多了,继续说,我这里就用release打包,先给release的编译目录提权。
sudo chmod -R 777 OneHundred
sudo chmod +x /home/yourname/Desktop/project/OneHundred/OneHundredWDemo
解释一下,OneHundredDemo是我编译目录下的可执行文件,上面那个语句是赋予目录权限,下面语句是赋予可执行程序可执行权限。
首先,进入编译文件目录。
自动查询并复制所有依赖库 ,OneHundredWDemo是可执行程序名,./是目录,你也可以在它下面新建一个lib文件夹,把依赖库全都放进去,这样根目录会干净不少,把./换成lib就行,
ldd OneHundredWDemo | grep "=> /" | awk '{print $3}' | xargs -I '{}' cp -v '{}' ./
注意,如果该命令没有检索到需要的依赖库,他是不会复制进去的,可以使用
ldd OneHundredWDemo
来查询所需的依赖库,如果发现 xxx.so => not found,则是未检索到该依赖库,只能手动复制。找到对应的依赖库,把它复制过来。如果你不知道缺少的依赖库在哪里,可以尝试find命令,不过不要抱太大希望,ldd找不到的,find也大概找不到,你可能需要安装缺少的依赖库,或者查找具体的依赖库信息。
设置启动shell脚本,以便自动sudo启动以及输入密码
sudo nano start.sh
在start.sh内写入代码,/home/yourname/Desktop/project/OneHundred/OneHundredWDemo是启动路径,'12345678' 是密码
export LD_LIBRARY_PATH=等号后面是依赖库路径,“>>”后面的是输出到日志,若出现问题,可使用上述日志文件进行排查。
使用LD_PRELOAD直接指定共享库路径。
LD_PRELOAD=/home/dfrl/Documents/project/OneHundred/libCameraWidget.so.1 此语句用于强制加载指定的依赖库,仅在上方代码中出现未检测到某个依赖库且该库已被手动复制到相应路径的情况下添加。否则,可删除该语句。
#!/bin/bash
export LD_LIBRARY_PATH=/home/yourname/Desktop/project/OneHundred:$LD_LIBRARY_PATH
echo 'Starting OneHundredWDemo' >> /home/yourname/Desktop/project/OneHundred/start.log
echo '12345678' | sudo-S LD_PRELOAD=/home/dfrl/Documents/project/OneHundred/libCameraWidget.so.1 /srv/project/OneHundred/OneHundredWDemo>>$log_file 2>&1;
echo 'OneHundredWDemo started' >> /home/yourname/Desktop/project/OneHundred/start.log
如果上面的解决方案没有效果,尝试将库路径添加到系统的共享库路径中,
创建配置文件:
echo "/home/yourname/Documents/project/OneHundred" | sudo tee /etc/ld.so.conf.d/onehundred.conf
"/home/dfrl/Documents/project/OneHundred"是你的依赖库路径,之后更新共享库缓存
sudo ldconfig
之后为shell脚本设置启动权限
sudo chmod +x start.sh
使用
./start.sh
就可以直接启动程序了,shell自动申请管理员权限,自动输入密码。如果出现问题,可以查看生成的start.log文件,它的路径前面已经设置。
二.开机自启
该程序还需要设置开机自动启动,系统级自启动目录在/etc/xdg/autostart,进入该目录,新建文件:
sudo nano OneHundred.desktop
输入代码:
[Desktop Entry]
Type=Application
Exec=/home/yourname/Desktop/project/OneHundred/start.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=OneHundredWDemo
Comment=OneHundredWDemo
键解释:
Type:执行的类型
Exec:执行命令的绝对路径
X-GNOME-Autostart-enabled:是否自动启动
Name:执行文件的名字
Comment:执行文件的说明
Hidden:是否在桌面环境的应用菜单或启动台中显示他
NoDisplay:控制是否应该显示在应用菜单或启动台中
之后给予运行权限
sudo chmod +x /etc/xdg/autostart/OneHundredSU.desktop
重启,成功运行,若未成功运行,可通过
journalctl -xe
命令来检查启动日志,
确保使用的是 GNOME 桌面环境,因为 X-GNOME-Autostart-enabled
仅在 GNOME 环境下生效。非桌面环境用systemd
服务启动,这里就不细说了。