树莓派qt开发笔记
# 前言
本文是移植一个使用 pcsc 的 qt 项目到树莓派上的一些笔记。
# 登录
# 串口登录
将 SD 卡使用读卡器连接到电脑上并打开 SD 卡盘符,修改
config.txt
和cmdline.txt
文件- 解除蓝牙对串口的占用,在 config.txt 文件最后添加:
dtoverlay=pi3-miniuart-bt
1- 修改根目录的
cmdline.txt
,将里面的内容全部替换成以下内容。以防万一,请先备份好这个文件。
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
1利用 USB 转 TTL 将树莓派和电脑连接
- TTL_RXD -> Raspberry_TXD
- TTL_TXD -> Raspberry_RXD
- TTL_GND -> Raspberry_GND
- 用 SecureCRT 串口登陆
- 打开 SecureCRT 软件,选择
文件
->快速连接
- 协议选择
serial
波特率选择上面cmdline.txt
中设置的115200
,端口从 PC 设备管理器中查看
提示
默认账号:pi
默认密码:raspberry
# ssh 远程登陆(网络登录)
树莓派通过网线直连PC,然后选择共享我们的本机网络。
- PC 通过 WLAN (wifi) 上网
更改适配器设置
界面中选择修改WLAN
属性。选择共享,设置共享网络给以太网。- 打开控制台,
arp -a
查看树莓派的IP
树莓派通过网线连接路由器上网,或者通过 wifi 上网。
- 使用 HDMI 视频线外接显示器,启动树莓派
- 打开树莓派终端,设置一下IP地址,并开启树莓派 ssh 功能
不管通过哪一种,最终要知道树莓派的IP地址,最好设置成固定IP,然后通过 secureCRT 的 SSH 连接树莓派
- 打开 SecureCRT 软件,选择
文件
->快速连接
- 协议选择
SSH2
, 主机名填写树莓派的ip地址
,用户名默认pi
# 更换更新源
把更新源改成国内的服务器,不然后面一些安装会很慢或者直接失败
- 查看树莓派版本
lsb_release -a
No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 10 (buster) Release: 10 Codename: buster
如上,可以查出版本为 buster
,即 Debian 10
- 备份源文件
更新的源文件主要有
/etc/apt/sources.list
(软件更新源)和/etc/apt/sources.list.d/raspi.list
(系统更新源)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak
2
- 更新源文件
# 编辑 `/etc/apt/sources.list` 文件,删除原文件所有内容,用以下内容取代:
deb [arch=armhf] http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
# 如果需要 arm64 软件源,在 `/etc/apt/sources.list` 中加上
deb [arch=arm64] http://mirrors.tuna.tsinghua.edu.cn/raspbian/multiarch/ buster main
# 编辑 `/etc/apt/sources.list.d/raspi.list` 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main
2
3
4
5
6
7
8
9
- 修改完毕后,执行更新命令
sudo apt-get update
# 安装开发运行环境
# qt 环境
- 查看一下内存,看是否满足安装的最低需求
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 14G 4.5G 8.9G 34% /
devtmpfs 430M 0 430M 0% /dev
tmpfs 462M 0 462M 0% /dev/shm
tmpfs 462M 47M 415M 11% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 462M 0 462M 0% /sys/fs/cgroup
/dev/mmcblk0p1 253M 49M 204M 20% /boot
tmpfs 93M 4.0K 93M 1% /run/user/1000
2
3
4
5
6
7
8
9
10
11
- 安装
sudo apt-get install qt5-default // 默认基本库
# sudo apt-get install qtcreator
2
这个项目是以前 qtcreator 创建的,这里我直接在树莓派上编译,我是直接远程 VScode 打开工程目录,直接修改相关文件后命令行直接编译,不需要 qtcreator, 如果需要 qtcreator,那就直接交叉编译,不然树莓派跑 qtcreator 太卡
- 卸载
sudo apt autoremove qtcreator
# pcsc-lite
PCSC-Lite
是Personal Computer/Smart Card Lite
的缩写。
pcsc-lite
是在libusb
基础上开发的。因此也需要安装libusb
。
pcsc-lite
包含一个pcscd
守护进程 和 一个被调用的库libpcsclite.so
- 安装
sudo apt-get install libusb-dev
sudo apt-get install libpcsclite-dev
sudo apt-get install pcscd
2
3
- 查看头文件跟库路径
dpkg -L libpcsclite-dev
打印如下:
/.
/usr
/usr/bin
/usr/bin/pcsc-spy
/usr/include
/usr/include/PCSC
/usr/include/PCSC/debuglog.h
/usr/include/PCSC/ifdhandler.h
/usr/include/PCSC/pcsclite.h
/usr/include/PCSC/reader.h
/usr/include/PCSC/winscard.h
/usr/include/PCSC/wintypes.h
/usr/lib
/usr/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf/libpcscspy.so.0.0.0
/usr/lib/arm-linux-gnueabihf/pkgconfig
/usr/lib/arm-linux-gnueabihf/pkgconfig/libpcsclite.pc
/usr/share
/usr/share/doc
/usr/share/doc/libpcsclite-dev
/usr/share/doc/libpcsclite-dev/changelog.Debian.gz
/usr/share/doc/libpcsclite-dev/changelog.gz
/usr/share/doc/libpcsclite-dev/copyright
/usr/share/doc/libpcsclite-dev/examples
/usr/share/doc/libpcsclite-dev/examples/pcsc_demo.c.gz
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/pcsc-spy.1.gz
/usr/lib/arm-linux-gnueabihf/libpcsclite.so
/usr/lib/arm-linux-gnueabihf/libpcscspy.so.0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
include:
/usr/include/PCSC
lib:/usr/lib/arm-linux-gnueabihf/libpcsclite.so
- 查看 pcscd 是否运行
ps -aux | grep pcscd
- 查看 usb 设备
lsusb
# 安装 CCID 驱动
sudo dpkg -i libacsccid1_1.1.6-1acr350_armhf.deb
# 项目移植
- 打开 SecureCRT,通过 SSH 登录树莓派,在 SecureCRT 的工具栏最后边,打开 SecureFX,通过 SecureFX 把之前的项目工程拉到树莓派中
- PC 端打开 VScode,安装
Remote Development
扩展 - 在 VScode 中
Ctrl + Shift + p
打开命令输入框,输入remote ssh
,在弹出的下拉列表中,选择Add New SSH Host
,输入ssh pi@192.168.91.102
(账户名@IP地址),回车然后选择ssh配置保存目录 - 继续打开命令输入框,输入
remote ssh
,在弹出的下拉列表中,选择Connect to Host
,在弹出的输入框选择我们之前配置的主机地址,然后输入密码就好了。(默认密码:raspberry) - 打开放在树莓派上的项目,按需求修改...
- 项目根目录下新建
build
目录,然后
mkdir build/debug
cd build/debug
qmake ../../helloQt CONFIG+=debug
make
2
3
4
# 知识小解
# 查看 sudo apt-get install 所安装的软件所在位置
# dpkg -L 软件名
dpkg -L qtcreator
2
默认安装位置:
下载的软件的存放位置:
/var/cache/apt/archives
安装后软件的默认位置:
/usr/share
可执行文件位置:
/usr/bin
配置文件位置:
/etc
lib文件位置:
/usr/lib
# dep 文件的卸载与安装
- 安装
sudo dpkg -i name.deb
- 卸载
注意: 软件名和软件的安装包名通常都是不一样的,找到自己的安装的软件后,才可以进行卸载。假如我们要卸载一个软件,我们可以使用
sudo dpkg -l
来查看已经安装的软件有哪些,我们还可以通过grep
进行过滤。
sudo dpkg -l | grep aboutName
sudo dpkg -r name
2
# grep 基本介绍
作用: 文本搜索工具,根据用户指定的 模式(过滤条件)
对目标文本逐行进行匹配检查,打印匹配到的行。
# 动态库找不到问题
程序启动后,动态库会被动态加载到内存中,通过 ldd(list dynamic dependencies)
命令可以检查动态库依赖关系。
# 库文件的搜索路径
- 在配置文件
/etc/ld.so.conf
中指定动态库搜索路径
需要添加其它库文件的路径,在文件的最后添加具体的路径即可,如: /usr/local/lib,添加后保存退出,然后在命令行
ldconfig
)
- 通过环境变量
LD_LIBRARY_PATH
指定动态库搜索路径
当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号
:
分隔, 如:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
- 在编译目标代码时指定该程序的动态库搜索路径
在编译目标代码时,通过 gcc 的参数
-Wl,-Bsymbolic,-rpath=
指定程序的动态库搜索路径,当指定多个动态库搜索路径时,路之间用冒号:
分隔。如:LDFLAGS = -Wl,-rpath=.:/usr/local/lib
, QT 项目可以在.pro
中通过QMAKE_LFLAGS
添加(注意不是QMAKE_LDFLAGS
,没有D), 如:QMAKE_LFLAGS += -Wl,-Bsymbolic,-rpath=.:$$PWD/lib
默认的动态库搜索路径
/lib
默认的动态库搜索路径
/usr/lib
# 库文件的搜索顺序
当系统加载可执行代码的时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取所依赖的动态库的绝对路径。
对于 ELF
格式的可执行程序,是由 ld-linux.so
来完成的,搜索的先后顺序是:
- 编译目标代码时指定的动态库搜索路径
- 环境变量
LDLIBRARY_PATH
指定的动态库搜索路径 - 配置文件
/etc/ld.so.conf
中指定的动态库搜索路径 - 默认的动态库搜索路径
/lib
- 默认的动态库搜索路径
/usr/lib
注:ld-linux.so就是动态载入器,是专门用来负责定位、加载程序所需要的所有动态库文件。现在的Linux操作系统的可执行程序基本上都是ELF格式的。
# QT shadow build
Shadow building means building a project in a separate directory, the build directory. The build directory is different from the source directory. One of the benefits of shadow building is that it keeps your source directory clean, which makes it faster to switch between build configurations. Therefore, shadow building is the best practice if you need many build configurations for a single set of source files. Shadow builds are also widely known as out-of-source builds to separate them from in-source builds or in-tree builds.
影子构建意味着在单独的目录构建项目,即构建目录。生成目录与源目录不同。影子构建的好处之一是它可以保持源目录的干净,从而可以更快地在构建配置之间切换。因此,如果一组源文件需要许多构建配置,则影子构建是最佳实践。 影子构建也被广泛称为源外构建,以将它们与源内构建或树内构建分开。
- qtCreator 构建
直接 Project
选项设置相应的 debug release 模式 及 shadow build 路径即可
- qmake 手动构建
直接在 shadow build
的路径下执行 qmake .pro路径 CONFIG+=debug
CONFIG+=debug
是 Debug 模式,Release 模式不需要加
- 指定临时文件生成目录
BASEPATH = ../build
CONFIG(debug, debug|release) {
BUILDDIR = $${BASEPATH}/debug
} else {
BUILDDIR = $${BASEPATH}/release
}
OBJECTS_DIR = $${BUILDDIR}/obj
MOC_DIR = $${BUILDDIR}/moc
RCC_DIR = $${BUILDDIR}/rcc
UI_DIR = $${BUILDDIR}/ui
2
3
4
5
6
7
8
9
10