带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)

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

  1. 先交叉编译wiringPi库,编译出的库适合香橙派,这时候交叉编译可执行程序的平台和链接库的格式也是正确的,然后通过-I和-L来指定链接的wiringPi库的头文件和库的位置,但是现在还没有学习过,后面学了补上
  • 此时如果把wiringPi库拿到Ubuntu上进行编译后,直接使用会报错
bash 复制代码
>   arm-linux-gnueabihf-gcc demo2.c -I -lwiringPi 
> /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
  • 报错原因:因为链接的库的格式不对,是宿主机的平台,查看库的文件格式会发现是x86的平台

2.直接把香橙派上编译好的wiringPi库传到ubuntu中进行使用

(1)将香橙派上的wiringPi库拿到ubuntu上

(2)给这两个库建立各自的软链接

bash 复制代码
> ln -s libwiringPi.so.2.46  libwiringPi.so 
> ln -s libwiringPiDev.so.2.46  libwiringPiDev.so

(3)进行交叉编译,分别给出头文件和库的路径

  • csb.c的源代码,这是香橙派控制超声波模块测距的代码
c 复制代码
#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>


#define Trig 0
#define Echo 1

double getDistance()
{
        double dis;
        struct timeval start;
        struct timeval stop;

        pinMode(Trig, OUTPUT);//设置Trig为输出引脚
        pinMode(Echo, INPUT);//设置Echo为输入引脚


        /*让超声波发波*/
        digitalWrite(Trig ,LOW);
        usleep(5);
        digitalWrite(Trig ,HIGH);
        usleep(10);
        digitalWrite(Trig ,LOW);


        while(!digitalRead(Echo));//等待其发送波
        gettimeofday(&start,NULL);//波发送出去的时候的时间
        while(digitalRead(Echo));//等待波回来
        gettimeofday(&stop,NULL);//波回来的时候的时间
        long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec -start.tv_usec);//计算时间

        printf("diffTime = %ld\n",diffTime);
        dis = (double)diffTime/1000000 * 34000 / 2;//计算距离
        return dis;
}


int main()
{
        double dis;


        if(wiringPiSetup() == -1){
                fprintf(stderr,"%s","initWringPi error");
                exit(-1);
        }

        while(1){
                dis = getDistance();
                printf("dis = %.2fcm\n",dis);
                usleep(500000);
        }


        return 0;
}
  • 编译
bash 复制代码
aarch64-linux-gnu-gcc csb.c -I ./wiringOP-master/wiringPi -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt -L ./ -o csb

然后可以成功编译出带wiringpi库的可执行文件

(4)将可执行的文件传回香橙派中进行运行

  • 先查看一下交叉编译后的可执行文件格式
bash 复制代码
file csb
  • 然后运行,结果如下
相关推荐
努力努力再努力wz4 分钟前
【C++高阶系列】外存查找的极致艺术:数据库偏爱的B+树底层架构剖析与C++完整实现!(附B+树实现的源码)
linux·运维·服务器·数据结构·数据库·c++·b树
踏着七彩祥云的小丑11 分钟前
Linux命令——开机自启配置
linux·运维·网络
clear sky .12 分钟前
[linux]buildroot什么用途
linux·运维·数据库
济61718 分钟前
I.MX6U Linux 驱动开发篇---阻塞IO实验--- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
济61719 分钟前
I.MX6ULL Linux 驱动开发篇---Linux非阻塞IO实验-- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
ulias2127 小时前
Linux系统中的权限问题
linux·运维·服务器
mzhan0179 小时前
Linux: lock: preempt_count 是一个线程级别的变量
linux·lock
Dream of maid10 小时前
Linux(下)
linux·运维·服务器
齐鲁大虾10 小时前
统信系统UOS常用命令集
linux·运维·服务器
ZzzZZzzzZZZzzzz…10 小时前
Nginx 平滑升级:从 1.26.3 到 1.28.0,用户无感知
linux·运维·nginx·平滑升级·nginx1.26.3·nginx1.28.0