C ++在多个其他类中使用单个类 - 编译时出现多个定义错误

时间:2017-08-17 22:54:35

标签: c++ visual-studio arduino

我下载了一个arduino库,通过I2C与MCP23017芯片通信。我的目标是在各种文件中使用这一类来具有不同的功能,本质上是与该芯片有关的库。

在构建运行7段多路复用显示器的代码之后,所有内容都编译得很好并能够加载到arduino上。在编写另一个类以仅使用第二个芯片作为输入之后,由于基类的多个定义,我开始得到编译错误。我习惯用VB编写代码,而不是C ++代码,所以不得不定义这样的类很混乱,我不知道该怎么做才能解决它。

这是错误:(这只是错误的片段,因为我认为这部分的要点已经足够好了.Adafruit_MCP23017.cpp文件中的每个例程都有此错误。)

Adafruit_MCP23017.cpp.o (symbol from plugin)*: In function Adafruit_MCP23017::bitForPin(unsigned char)
(.text+0x0)*: multiple definition of Adafruit_MCP23017::readGPIO(unsigned char)
Adafruit_MCP23017.cpp.o (symbol from plugin)*: (.text+0x0): first defined here

Mainfile标题:

#include <Arduino.h>
#include <Wire.h>
#include <unistd.h>
#include "SevenSegmentDisplay_MCP23017.h"
#include "I2C_Input_MCP23017.h"

SevenSegmentDisplay SSD;
I2C_Input_MCP23017 INP;

SevenSegmentDisplay.h标题:

#pragma once
#ifndef _Adafruit_MCP23017_H_   
    #include <Adafruit_MCP23017.h>
#endif
#include <Arduino.h> // Need for serial output and 'delay' function

SevenSegmentDisplay.cpp标题:

#include "SevenSegmentDisplay_MCP23017.h"

I2C_Input_MCP23017.h标题:

#pragma once
#include <Adafruit_MCP23017.h>
#include <Arduino.h> // Need for serial output and 'delay' function

I2C_Input_MCP23017.cpp标题:

#include "I2C_Input_MCP23017.h"

解决方案编辑: 看完有人发布的答案后,我发现了问题。我不认为基类是否符合鼻烟(缺乏对例程的评论,使得它很难使用,因为你没有描述每个例程接受的变量或它做了什么。)当这样做时,我将其纳入解决方案。 问题在于它是从库文件夹和解决方案本身中包含它(即使解决方案仅引用了库本身的文件,也没有创建新文件)。我删除了对相关课程的引用(在下图中突出显示),并且程序编译完美。 (通过添加它们进行测试,导致相同的故障)。

TL; DR:如果您的库中已有该文件,请不要将其包含在解决方案中,因为它似乎想要抓取它两次。一旦#included和一次在解决方案资源管理器中。

Here was the problem:

1 个答案:

答案 0 :(得分:0)

我怀疑您的Arduino / libraries目录中的两个位置都有Adafruit_MCP23017库(.c和.h文件)。

可能(可能!)在两个/ libraries / Adafruit_MCP23017 /和/ libraries / SevenSegmentDisplay_MCP23017 / utility /

Adafruit通过在下载档案中包含任何必需的子库,使其库初学者得到证明。但是,只要您尝试直接使用子库,它就会混淆。

如果是这种情况,那么您需要修改SevenSegmentDisplay_MCP23017.h文件以从

更改
#include <utility/Adafruit_MCP23017.h>

#include <Adafruit_MCP23017.h>

并从/ libraries / SevenSegmentDisplay_MCP23017 / utility /删除Adafruit_MCP23017.h和Adafruit_MCP23017.c 。目录