带WiringPi库的交叉编译处理

  • Post author:
  • Post category:其他


1.我们先把一个在树莓派下写的代码及从网上下载好的wiringPi库发到ubuntu:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<wiringPi.h>
#define SWI 26
int main()
{
        if(wiringPiSetup() == -1)
        {
                printf("硬件接口初始化失败\n");
                perror("");
        }
        char str[32]={0};
        pinMode(SWI,OUTPUT);
        digitalWrite(SWI,HIGH);
        while(1)
        {
                printf("请输入on或off\n");
                scanf("%s",str);
                if(strcmp(str,"on") == 0)
                {
                        digitalWrite(SWI,LOW);
                }
                else if(strcmp(str,"off") == 0)
                {
                        digitalWrite(SWI,HIGH);
                }
                else
                {
                        printf("输入出错...\n");
                }
        }
        return 0;
}

用已经安装好了的交叉编译工具进行编译:arm-linux-gnueabihf-gcc demo1.c,但是出现了以下错误:

头文件不认识,我们应该要链上头文件才行:

arm-linux-gnueabihf-gcc demo1.c -I /home/lhy/wiringPI/WiringPi/wiringPi

然后发现还是出错了:

这是因为找不到这些函数,因为这些函数在wiringPi库里面,应该要链上wiringPi库,但是还是出现了以下问题:

这是因为这个wiringPi库是x86的,而这个交叉编译的是ARM的,不兼容,


解决办法:1.先交叉编译要使用的库;


2.在此处(仅限于此处)可以把树莓派的wiringPi库拿过去ubuntu使用。树莓派的库在:

在ubuntu下使用从树莓派拿过来的wiringPi库用ln -s命令创建一个软链接,并进行编译:


生成 的可执行文件(a.out)不可以在ubuntu下运行,却可以在树莓派下运行,先在ubuntu下运行,并查看文件的属性:

可以看出这个可执行文件(a.out)是ARM的,再试一下在树莓派下运行:

可看出在ARM架构的树莓派是可运行的,在x86架构的宿主机的ubuntu虚拟机中是运行不了的,这就是交叉编译的作用的体现。

笔记总结:

带wiringPi库的交叉编译如何进行

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

2. 通过-I -L来指定   -I(大写i)是链接到头文件,-L是到指定路径链库, -l(小写L)是链接到哪个库

因为链接的库的格式不对,是宿主机的平台,出现以下错误

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. 软链接文件有类似于Windows的快捷方式。

2. 在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

3. 你选定的位置上生成一个文件的镜像,不会占用磁盘空间

如何生成:

ln -s libwiringPi.so.2.50 libwiringPi.so

指令 参数   要被链接的文件    软链接文件名字

硬链接:ln libwiringPi.so.2.50 libwiringPi.so

它会在你选定的位置上生成一个和源文件大小相同的文件

参考文章:

https://www.cnblogs.com/zhangna1998517/p/11347364.html



版权声明:本文为weixin_51110641原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。