编译wiringPi库
-
正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。
-
通过-I -L来指定
因为链接的库的格式不对,是宿主机的平台,出现以下错误:
指令:arm-linux-gnueabihf-gcc demo2.c -I
arm-linux-gnueabihf-gcc demo2.c -I /home/CLC/lessonPI/WiringPi/wiringPi -lwiringPi
/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lwiringPi
collect2: error: ld returned 1 exit status
解决这个问题:
把树莓派的wringPI库拿上来用
同步 1:
把 libwiringPi.so.2.50库拷贝给Ubuntu,并且创造软连接 libwiringPi.so(ln -s libwiringPi.so.2.50 libwiringPi.so
)
Ubuntu上的操作:同步 1
CLC@Embed_Learn:~/lessonPi$ ls
tools-master tools-master.zip WiringPi
CLC@Embed_Learn:~/lessonPi$ ls
libwiringPi.so.2.50 tools-master tools-master.zip WiringPi
CLC@Embed_Learn:~/lessonPi$ ls
demo1.c libwiringPi.so.2.50 tools-master tools-master.zip WiringPi
CLC@Embed_Learn:~/lessonPi$ ln -s libwiringPi.so.2.50 libwiringPi.so
CLC@Embed_Learn:~/lessonPi$ ls -l
total 353068
-rw-r--r-- 1 CLC book 571 8月 1 23:55 demo1.c
lrwxrwxrwx 1 CLC book 19 8月 1 23:56 libwiringPi.so -> libwiringPi.so.2.50
-rwxr-xr-x 1 CLC book 70708 8月 1 23:49 libwiringPi.so.2.50
drwxr-xr-x 9 CLC book 4096 4月 22 2020 tools-master
-rwxr-xr-x 1 CLC book 361450444 7月 30 18:12 tools-master.zip
drwxr-xr-x 12 CLC book 4096 8月 1 22:54 WiringPi
CLC@Embed_Learn:~/lessonPi$ ls
demo1.c libwiringPi.so.2.50 tools-master.zip
libwiringPi.so tools-master WiringPi
CLC@Embed_Learn:~/lessonPi$
raspberryPi 上的操作:同步 1
pi@raspberrypi:/usr/lib $ ls
apt emacsen-common ldscripts libkeybinder.so.0.1.0 libsigc-1.2.so.5 man-db pypy tasksel
arm-linux-gnueabihf file libblas liblapack.so.3 libsigc-1.2.so.5.0.7 menu-cache python2.7 tc
aspell gcc libblas.so.3 liblilv-0.so.0 libsrtp.so.0 mime python3 tcltk
avahi git-core libBLT.2.5.so.8.6 liblilv-0.so.0.24.2 libsrtp.so.0.0 modules-load.d python3.5 thunar-archive-plugin
binfmt.d glib-networking libBLTlite.2.5.so.8.6 libpigpiod_if2.so libsupp.a NetworkManager qpdfview timidity
blt2.5 gnupg libgksu libpigpiod_if.so libunique-1.0.so.0 openssh raspberrypi-sys-mods tmpfiles.d
bluetooth gnupg2 libgksu2.so.0 libpigpio.so libunique-1.0.so.0.100.6 os-release raspi-config udisks2
chromium-browser gold-ld libgksu2.so.0.0.2 libpypy-c.so libvte9 packagekit rc-gui valgrind
compat-ld groff libgnome-menu-3.so.0 libresid-builder.so.0 libvte.so.9 perl5 rp-prefapps vnc
cups gvfs libgnome-menu-3.so.0.0.1 libresid-builder.so.0.0.1 libvte.so.9.2800.2 piclone sasl2 X11
dbus-1.0 ispell libhardsid-builder.so.0 libRTIMULib.so libwiringPiDev.so pipanel sftp-server xorg
dconf jvm libhardsid-builder.so.0.0.1 libRTIMULib.so.7 libwiringPiDev.so.2.50 pkgconfig ssl
debug kernel libident.so.0 libRTIMULib.so.7.2.1 libwiringPi.so pkg-config.multiarch sudo
dhcpcd5 klibc libident.so.0.22 libsidplay2.so.1 libwiringPi.so.2.50 pm-utils systemd
dpkg lapack libkeybinder.so.0 libsidplay2.so.1.0.1 locale policykit-1 tar
pi@raspberrypi:/usr/lib $ scp libwiringPi.so.2.50 CLC@192.168.111.1:/home/CLC/lessonPi
CLC@192.168.111.1's password:
libwiringPi.so.2.50 100% 69KB 66.3KB/s 00:01
关于gcc没有加 -I 和 -L的报错情况 以及 解决完成的情况,完成wiringPi库的交叉编译,并且文件拷贝到树莓派上运行
CLC@Embed_Learn:~/lessonPi$ arm-linux-gnueabihf-gcc demo1.c -I . -lwiringPi
demo1.c:2:22: fatal error: wiringPi.h: No such file or directory
#include <wiringPi.h>
^
compilation terminated.
CLC@Embed_Learn:~/lessonPi$ arm-linux-gnueabihf-gcc demo1.c -I /home/CLC/lessonPi/WiringPi/ -lwiringPi
demo1.c:2:22: fatal error: wiringPi.h: No such file or directory
#include <wiringPi.h>
^
compilation terminated.
CLC@Embed_Learn:~/lessonPi$ arm-linux-gnueabihf-gcc demo1.c -I /home/CLC/lessonPi/WiringPi/ -L -lwiringPi
demo1.c:2:22: fatal error: wiringPi.h: No such file or directory
#include <wiringPi.h>
^
compilation terminated.
CLC@Embed_Learn:~/lessonPi$ arm-linux-gnueabihf-gcc demo1.c -I /home/CLC/lessonPi/WiringPi/wiringPi -lwiringPi
/home/CLC/lessonPi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lwiringPi
collect2: error: ld returned 1 exit status
CLC@Embed_Learn:~/lessonPi$ arm-linux-gnueabihf-gcc demo1.c -I /home/CLC/lessonPi/WiringPi/wiringPi -L -lwiringPi
/tmp/ccvKGBXU.o: In function `main':
demo1.c:(.text+0x14): undefined reference to `wiringPiSetup'
demo1.c:(.text+0x3c): undefined reference to `pinMode'
demo1.c:(.text+0x70): undefined reference to `digitalWrite'
demo1.c:(.text+0x88): undefined reference to `digitalWrite'
collect2: error: ld returned 1 exit status
CLC@Embed_Learn:~/lessonPi$ arm-linux-gnueabihf-gcc demo1.c -I /home/CLC/lessonPi/WiringPi/wiringPi -L. -lwiringPi
CLC@Embed_Learn:~/lessonPi$ ls
a.out libwiringPi.so tools-master WiringPi
demo1.c libwiringPi.so.2.50 tools-master.zip
CLC@Embed_Learn:~/lessonPi$ arm-linux-gnueabihf-gcc demo1.c -I /home/CLC/lessonPi/WiringPi/wiringPi -L. -lwiringPi -o crossCompilation
CLC@Embed_Learn:~/lessonPi$ ls
a.out demo1.c libwiringPi.so.2.50 tools-master.zip
crossCompilation libwiringPi.so tools-master WiringPi
` ` `
```bash
CLC@Embed_Learn:~/lessonPi$ history |grep scp
1932 scp armOne pi@192.168.111.1:/home/pi
1933 scp one pi@192.168.111.1:/home/pi
1966 scp armClient pi@192.168.111.1:/home/pi
1971 scp armServer pi@192.168.111.1:/home/pi
2054 history |grep scp
CLC@Embed_Learn:~/lessonPi$ scp crossCompilation pi@192.168.111.1:/home/pi
pi@192.168.111.1's password:
crossCompilation 100% 7220 7.1KB/s 00:00
CLC@Embed_Learn:~/lessonPi$ file a.out
a.out: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xe201a1ce5c82794649aa17bb878357389050c43c, not stripped
CLC@Embed_Learn:~/lessonPi$ file crossCompilation
crossCompilation: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xe201a1ce5c82794649aa17bb878357389050c43c, not stripped
raspberryPi上的操作:运行,可以看到引脚的电平变化
pi@raspberrypi:~/demo $ ./crossCompilation
输入:‘0’或‘1’,0-断开开关,1-打开开关
0
输入:‘0’或‘1’,0-断开开关,1-打开开关
1
输入:‘0’或‘1’,0-断开开关,1-打开开关
pi@raspberrypi:~ $ gpio readall
+-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | OUT | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+
pi@raspberrypi:~ $ gpio readall
+-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | OUT | 0 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+
一些指令注释:
WiringPi库
- 官网的WiringPi不是很完整,都是gcc,导致编译后的文件只适用于X86_64
- 解压后一般要看一下,INSTALL和READER.txt,进行安装
软链接和硬链接
软链接:
概念:
- 软链接文件有类似于Windows的快捷方式。
- 在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
- 你选定的位置上生成一个文件的镜像,不会占用磁盘空间
- 如何生成:
ln -s libwiringPi.so.2.50 libwiringPi.so
指令 参数 要被链接的文件 软链接文件名字
硬链接: ln libwiringPi.so.2.50 libwiringPi.so
硬链接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬链接。硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除。
-
具体用法是:
ln -s 源文件 目标文件
。
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
例如:ln -s /bin/less /usr/local/bin/less -
-s 是代号(symbolic)的意思。
这里有两点要注意:- ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
- ln的链接又软链接 和硬链接两种,软链接就是ln -s XX XX, 它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。