【问题标题】:undefined reference to ArduiPi_OLED and Adafruit_GFX未定义对 ArduiPi_OLED 和 Adafruit_GFX 的引用
【发布时间】:2018-06-17 03:43:24
【问题描述】:

美好的一天,新年快乐! 我实际上有很多困难要解决我遇到的问题,可能是由于我缺乏 C++ 知识

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

但是,当我在 Raspberry 上收到 Radio 数据时,我想在 LCD 显示屏上显示它。

让我为您提供最详细的信息:

首先要记住,安装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/local/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()': rf95_server.cpp:(.text._ZN12Adafruit_GFXD2Ev[_ZN12Adafruit_GFXD5Ev]+0x30): undefined reference tovtable 用于 Adafruit_GFX' rf95_server.o:在 函数ArduiPi_OLED::~ArduiPi_OLED()': rf95_server.cpp:(.text._ZN12ArduiPi_OLEDD2Ev[_ZN12ArduiPi_OLEDD5Ev]+0x38): undefined reference tovtable for ArduiPi_OLED' collect2:错误: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/local/inlcude?
  2. /usr/local/bin?
  3. ~/Soft/RadioHead/example/raspi/rf95?

我还尝试通过在 INCLUDE 之前添加以下内容并修改 INCLUDE 行如下来修改 Makefile

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

但这些都不起作用。

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

非常感谢您的帮助

【问题讨论】:

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


    【解决方案1】:

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

    LIBS = -lbcm2835 -lArduiPi_OLED

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

    【讨论】:

    • 亲爱的迈克,太好了!非常感谢。它有帮助,但它会生成一条新消息错误: //usr/local/lib/libArduiPi_OLED.so : référence indéfinie vers « i2c_smbus_write_i2c_block_data » //usr/local/lib/libArduiPi_OLED.so : référence indéfinie vers « i2c_smbus_write_word_data » //usr/ local/lib/libArduiPi_OLED.so : 参考 indéfinie vers « i2c_smbus_write_byte_data »。我应该做类似的事情吗?我在 /usr/local/include 中没有这样的文件的问题
    • 亲爱的迈克,不行,我可以编译!!!问题出在其他地方。以前我安装了一些 Python 库来在我的 OLED 上显示消息。但我也试图将 OLD 与 c++ 一起使用。我还观察到一个关于 OLED 的问题,它也说明了关于 i2c_smbus 的一些问题。我在没有 Python 的情况下从头开始重新安装了我的 Raspbery,我应用了你的提议,我可以编译 RadioLibrary。太好了,感谢您的解决方案,我将继续!干杯
    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 2016-02-23
    • 2012-01-30
    • 2011-08-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多