5

我目前正在尝试获取为 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>

我难住了。我怎么解决这个问题?

4

1 回答 1

10

您正在尝试将 C++ 代码编译为 C。您可以(通常)执行相反的操作,但您需要将其重写为纯 C 或使用 C++ 编译器(avr-g++出现)。将文件更改为.cpp可能会告诉构建系统自动使用 C++ 编译器。

于 2013-02-15T19:15:09.137 回答