我正在尝试通过在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
答案 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 文件;这是一个错字问题吗?或者声明和定义的签名可能会无意中发生变化。
编辑:我认为由于循环标头依赖性而导致此错误,但我无法立即创建示例。在这种情况下,这种情况极不可能。