在Cross Compiler上为libr链接libwiringPi

时间:2016-04-09 13:49:48

标签: c gcc raspberry-pi wiringpi

我有一个RPI 3模型B,我想编译一个小程序来与设备的SPI进行交互。我在Linux桌面上编写程序,所以我想交叉编译程序。
为此我从这里安装了交叉编译器:https://github.com/raspberrypi/tools
我正在使用witingPi库,所以我按照这些说明进行了安装:http://wiringpi.com/download-and-install/
我写的程序是网络上的一个例子(只是为了确保我可以编译并运行它):

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <wiringPiSPI.h>

#define CHANNEL 1

void send3(uint8_t a, uint8_t b, uint8_t c) {
  uint8_t buf[3];

  buf[0] = a;
  buf[1] = b;
  buf[2] = c;
  wiringPiSPIDataRW(CHANNEL, buf, 3);
}

int main(int argc, char** argv) {
  if (wiringPiSPISetup(CHANNEL, 4000000) < 0) {
    fprintf (stderr, "SPI Setup failed: %s\n", strerror (errno));
    exit(errno);
  }

  printf("start\n");
  send3(0x40, 0x0A, 0x0B);
  send3(0x41, 0x0A, 0x00);
  send3(0x40, 0x00, 0xFF);
  send3(0x40, 0x0C, 0xFF);
  send3(0x40, 0x13, 0x00);
  send3(0x40, 0x01, 0x00);
  send3(0x40, 0x04, 0xFF);
  printf("done\n");
  return 0;
}

问题是我无法使用wiringPi库连接部分工作: 编译部分运作良好: ./arm-linux-gnueabihf-gcc -c /home/guy/main.c -o /home/guy/main.o -I /home/guy/toolchain/wiringPi/wiringPi
其中/home/guy/toolchain/wiringPi/wiringPi是wiringPi图书馆和标题的路径。我确信这很有效,因为编译成功(意味着对wiringPi头的访问成功)。

接下来,我尝试使用以下命令将代码与wirinPi库链接并创建可执行文件: ./arm-linux-gnueabihf-gcc -L/home/guy/toolchain/wiringPi/wiringPi -o "AngleCalculator" /home/guy/main.o -lwiringPi

此操作失败,我收到以下消息:/home/guy/toolchain/wiringPi/wiringPi/libwiringPi.so: file not recognized: File format not recognized

有些帖子建议在链接过程中使用-static标记,但它仍然无法正常工作,我收到以下消息:/home/guy/toolchain/rpi2/tools/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。我想这是因为没有staticPi的静态版本。

在RPI设备上运行相同的链接命令本身可以正常工作。 我不知道是什么导致了这个错误。我应该使用另一个版本的gcc交叉编译器吗?也许我应该使用另一个版本的wiringPi?

由于

1 个答案:

答案 0 :(得分:0)

经过进一步调查,我发现这是我的坏事:
下载wiringPi库时,我用桌面的工具链构建了它。这创建了一个so文件,当试图将它与pi的工具链链接时会导致错误。
我已将pi文件从pi复制到我的桌面,一切正常。