私は現在、Arduino USBホストシールド用に作成されたコードライブラリを取得し、Arduinoコアライブラリから切り離して、Arduino以外のマイクロコントローラープロジェクトでコードを使用できるようにしようとしています。
コードを見ると、Arduinoコードベースへの強い依存関係はあまりありませんが、おそらくArduinoビルドシステムとLUFAビルドシステムの違いが原因で、いくつかの奇妙なエラーが発生しています。具体的には、ヘッダーファイルの約75%で、それぞれ数十回、次のエラーが発生します。
error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
エラーがエラー内の異なるトークンを示している場合もありますが、それでも同じエラーです。さまざまなフォーラムやStackOverflowで同様の問題をたくさん見つけましたが、解決策は毎回異なる傾向があります。
明確にするために、このコードは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>
私は困惑しています。どうすればこの問題を解決できますか?