我目前正在尝试获取为 Arduino USB Host shield编写的代码库,并将其与 Arduino 核心库分离,以便我可以在非 Arduino 微控制器项目中使用该代码。
通过查看代码,对 Arduino 代码库没有太多硬依赖,但我遇到了一些奇怪的错误,这可能是由于 Arduino 构建系统和LUFA 构建系统之间的差异造成的。具体来说,我在大约 75% 的头文件中收到以下错误,每个文件都有几十次:
error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
有时,错误表明错误中的标记不同,但它仍然是相同的错误。我在各种论坛和 Stack Overflow 上发现了很多类似的问题,但解决方案往往每次都不同。
需要明确的是,这段代码在 Arduino 构建系统中可以 100% 编译,但是当我尝试使用 LUFA 模板 makefile 直接使用 WinAVR 构建时会出现这些错误。通过查看代码,我确定我需要#define
一些值,例如-DARDUINO=102
(或至少一些值 >=100,但我使用的 Arduino IDE 的版本是 1.0.2,所以我认为那是一个很好的使用价值)。
所以我想我正在寻找熟悉 Arduino 构建系统的人来帮助我弄清楚我缺少什么。完整的代码库可以在这里找到,但是为了提供一个简单的例子来演示这个问题,而不包括整个代码库,这里是printhex.h
:
#if !defined(__PRINTHEX_H__)
#define __PRINTHEX_H__
#if defined(ARDUINO) && ARDUINO >=100
#include "Arduino.h"
#else
#include <WProgram.h>
#endif
template <class T>
void PrintHex(T val)
{
T mask = (((T)1) << (((sizeof(T) << 1) - 1) << 2));
while (mask > 1)
{
if (val < mask)
Serial.print("0");
mask >>= 4;
}
Serial.print((T)val, HEX);
}
template <class T>
void PrintHex2(Print *prn, T val)
{
T mask = (((T)1) << (((sizeof(T) << 1) - 1) << 2));
while (mask > 1)
{
if (val < mask)
prn->print("0");
mask >>= 4;
}
prn->print((T)val, HEX);
}
template <class T>
void PrintBin(T val)
{
for (T mask = (((T)1) << (sizeof(T) << 3)-1); mask; mask>>=1)
if (val & mask)
Serial.print("1");
else
Serial.print("0");
}
#endif
我应该注意我确实已经Arduino.h
复制到我的包含路径,并且如果我包含Arduino.h
到我的主.c
文件中,它编译得很好,所以问题不存在。printhex.h
但是,包括会产生以下结果:
In file included from MIDI.c:38:
Lib/HostShield/printhex.h:26: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
Lib/HostShield/printhex.h:41: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
Lib/HostShield/printhex.h:56: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
make: *** [MIDI.o] Error 1
第 26、41 和 56 行是以下 3 个实例:
template <class T>
我难住了。我怎么解决这个问题?