1

我试图通过在 IDE 中声明一个新的硬件“板”来让自定义机器人与 Arduino IDE 一起工作。这包含所有映射和诸如此类的东西,但是存在一个我可以访问源的库。

Arduino IDE 生成一个 cpp 文件如下:

    #line 1 "cbotj.ino"
    #include "Arduino.h"
    void setup();
    void loop();
    #line 1
    void setup()
    {
         LED_open();
    }

    void loop()
    {

    }

然后我得到错误:

cbotj.cpp.o: In function `setup':
/Applications/cbotj.ino:3: undefined reference to `LED_open()'

现在在 Arduino.h 中我拥有的硬件核心

SUBSYS_OPENSTAT LED_open( void );

该函数本身.c在核心硬件函数(例如 pinMode)内的另一个文件中实现,并且完全有效,因为它可以作为其他 IDE(例如 Atmel 的 AVR Studio 4 和 6)的编译库。

为什么我得到未定义的引用?包括标题等。

如果我要在引脚上使用诸如 pinMode 之类的东西来使 LED 工作正常,则选择硬件是因为它可以正常工作。

TIA

4

2 回答 2

3

从 C++ 项目中的文件链接到函数时.c(这似乎是您所拥有的),您需要将函数声明为extern "C".

尝试更改头文件';

SUBSYS_OPENSTAT LED_open( void );

extern "C" {
    SUBSYS_OPENSTAT LED_open( void );
}

编辑:似乎不止一个文件对 C++ 感到困惑,请尝试将所有C包含extern "C"在您的 cpp 文件中;

extern "C" {
  #include "Arduino.h"
}

void setup();
void loop();

void setup()
{
     LED_open();
}

void loop()
{

}
于 2013-05-24T17:38:36.510 回答
0

添加头文件对确保链接器可以找到函数定义没有任何帮助。也就是说,给定一个头文件,链接器将无法自行查找具有定义(如果不同)的文件。(如果你忘记了头文件,你会得到类似“未定义符号”之类的编译错误。)

所以你需要.cpp在你的项目中包含这个文件(错误是因为没有这样做)。你认为你有(从评论中,刚刚看到),但你可能没有。:) 在评论中,您显示包含.c文件;这里的问题是错字吗?或者声明和定义的签名可能会无意中不同。

编辑:我认为由于循环标头依赖关系而出现此错误,但我无法立即创建示例。无论如何,在这种情况下这是极不可能的。

于 2013-05-24T17:11:49.053 回答