这是如何定义的?

时间:2013-05-24 16:59:50

标签: c avr arduino-ide

我正在尝试通过在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 );

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

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

如果我在引脚上使用像pinMode这样的东西,那么硬件会被选中,因为它可以正常工作。

TIA

2 个答案:

答案 0 :(得分:3)

当链接到C ++项目中的.c文件中的函数时(看起来就像你的那样),you need to declare the function as 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()
{

}

答案 1 :(得分:0)

在确保链接器可以找到函数 definitions 方面,添加头文件不会对您有任何帮助。也就是说,给定一个头文件,链接器将无法使用它自己的定义(如果它是不同的)搜索该文件。 (如果您忘记了头文件,则会出现“未定义符号”或其他内容的编译错误。)

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

编辑:我认为由于循环标头依赖性而导致此错误,但我无法立即创建示例。在这种情况下,这种情况极不可能。