带wiringPi库的交叉编译及软硬链接

编译wiringPi库
  1. 正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。

  2. 通过-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  81 23:55 demo1.c
lrwxrwxrwx  1 CLC book        19  81 23:56 libwiringPi.so -> libwiringPi.so.2.50
-rwxr-xr-x  1 CLC book     70708  81 23:49 libwiringPi.so.2.50
drwxr-xr-x  9 CLC book      4096  422  2020 tools-master
-rwxr-xr-x  1 CLC book 361450444  730 18:12 tools-master.zip
drwxr-xr-x 12 CLC book      4096  81 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,进行安装
软链接和硬链接
软链接:

概念:

  1. 软链接文件有类似于Windows的快捷方式。
  2. 在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
  3. 你选定的位置上生成一个文件的镜像,不会占用磁盘空间
  4. 如何生成:
    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)的意思。
    这里有两点要注意:

    1. ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
    2. ln的链接又软链接 和硬链接两种,软链接就是ln -s XX XX, 它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值