对ArduiPi_OLED和Adafruit_GFX

时间:2018-01-08 07:00:37

标签: c++ makefile reference raspberry-pi shared-libraries

美好的一天,新年快乐! 我实际上遇到很多困难来解决我遇到的问题,可能是因为我对C ++的熟悉程度

我在Raspberry Zero W上下载并安装了一个库,以获取Radio包和另一个在OLED LCD上显示消息的库。 RadioHead OLED 两者都可以独立工作。

然而,当我在Raspberry上收到无线电数据时,我想将它显示在我的液晶显示器上。

让我为您提供最多的细节:

首先请记住,安装ArduiPi_OLED后,一些文件将复制到/ usr / local / include和usr / local / lib /

/usr/local/lib $ ls -ls
total 144
 0 lrwxrwxrwx 1 root staff    22 Jan  6 22:54 ArduiPi_OLED.so.1 -> libArduiPi_OLED.so.1.0
 0 lrwxrwxrwx 1 root staff    37 Jan  6 22:54 libArduiPi_OLED.so -> /usr/local/lib/libArduiPi_OLED.so.1.0
 0 lrwxrwxrwx 1 root staff    37 Jan  6 22:54 libArduiPi_OLED.so.1 -> /usr/local/lib/libArduiPi_OLED.so.1.0
64 -rwxr-xr-x 1 root staff 62692 Jan  6 22:54 libArduiPi_OLED.so.1.0
68 -rw-r--r-- 1 root staff 67576 Jan  7 19:41 libbcm2835.a
 4 drwxrwsr-x 3 root staff  4096 Sep  7 17:39 pypy2.7
 4 drwxrwsr-x 4 root staff  4096 Dec 31 01:08 python2.7
 4 drwxrwsr-x 3 root staff  4096 Sep  7 17:02 python3.5

的/ usr /本地/ inlcude:

ls -ls /usr/local/include/
total 100
 4 -rw-r--r-- 1 root staff  3931 Jan  6 22:54 Adafruit_GFX.h
 8 -rw-r--r-- 1 root staff  7272 Jan  6 22:54 ArduiPi_OLED.h
 4 -rw-r--r-- 1 root staff  2474 Jan  6 22:54 ArduiPi_OLED_lib.h
84 -rw-r--r-- 1 root staff 82921 Jan  7 19:41 bcm2835.h

要收听将收听Radio sender模块发送的数据的脚本,我在编译后启动以下脚本 rf95_server (它工作正常)

由于我想从收到的Radio包中打印一些小文本,我开始在rf95_server.cpp中添加以下内容

// For OLED LCD
#include "ArduiPi_OLED_lib.h"
#include "Adafruit_GFX.h"
#include "ArduiPi_OLED.h"
#include <getopt.h>
// Instantiate the display
ArduiPi_OLED display;

然后我从

编译
cd RadioHead/examples/raspi/rf95
sudo make

不幸的是,我的终端打印了以下信息:

  

g ++ rf95_server.o RH_RF95.o RasPi.o RHHardwareSPI.o RHGenericDriver.o   RHGenericSPI.o RHSPIDriver.o -lbcm2835 -o rf95_server rf95_server.o:   在函数__static_initialization_and_destruction_0(int, int)': rf95_server.cpp:(.text+0x438): undefined reference to 中ArduiPi_OLED :: ArduiPi_OLED()'rf95_server.o:在函数中   Adafruit_GFX的Adafruit_GFX::~Adafruit_GFX()': rf95_server.cpp:(.text._ZN12Adafruit_GFXD2Ev[_ZN12Adafruit_GFXD5Ev]+0x30): undefined reference to vtable'rf95_server.o:In   函数ArduiPi_OLED::~ArduiPi_OLED()': rf95_server.cpp:(.text._ZN12ArduiPi_OLEDD2Ev[_ZN12ArduiPi_OLEDD5Ev]+0x38): undefined reference to vtable for ArduiPi_OLED'collect2:error:ld   返回1退出状态Makefile:45:目标'rf95_server'的配方   失败了:*** [rf95_server]错误1

如果我评论以下

ArduiPi_OLED display;

没有错误消息。

我认为问题是因为我的rf95_server.cpp无法找到对ArduiPi_OLED库的引用,这是我的问题,因为我不知道该怎么做。

首先,我希望在make命令中添加一个选项

sudo make -I [path-of-ArduiPi_OLED]

我不知道-I是否正确 我不知道如何格式化路径

  1. 的/ usr /本地/ inlcude?
  2. 的/ usr / local / bin中?
  3. 〜/软/无线电头/示例/ raspi / rf95?
  4. 我还尝试通过在INCLUDE之前添加以下内容并修改INCLUDE行来修改Makefile

    OLEDBASE = ../../../../ArduiPi_OLED
    INCLUDE = -I$(RADIOHEADBASE) -I$(OLEDBASE)
    

    但这都不起作用。

    所以我的问题:如何将ArduiPi_OLED包含在一个“属于”radioHead的rf95_server.cpp脚本中?

    许多人感谢你的帮助

1 个答案:

答案 0 :(得分:2)

我想你忘了链接ArduiPi_OLED库了。您需要在makefile中修改LIBS变量:

LIBS = -lbcm2835 -lArduiPi_OLED

此外,如果您使用#include <ArduiPi_OLED.h>包含库标头,编译器将自动在系统路径中查找标头/usr/local/include。 (例如,参见this thread