1

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 );

関数自体は.c、コア ハードウェア関数 (pinMode など) 内の別のファイルに実装され、Atmel の AVR Studio 4 および 6 などの他の IDE 用のコンパイル済みライブラリとして機能するため、完全に有効です。

未定義の参照が発生するのはなぜですか? ヘッダーなどが含まれています。

LED のピンで pinMode などを使用すると、ハードウェアが正常に動作するように選択されます。

ティア

4

2 に答える 2

3

.cC++ プロジェクト (あなたが持っているもののようです)のファイルから関数にリンクするときは、関数を として宣言する必要がありますextern "C"

ヘッダー ファイルを変更してみてください。

SUBSYS_OPENSTAT LED_open( void );

extern "C" {
    SUBSYS_OPENSTAT LED_open( void );
}

編集: 複数のファイルが C++ について混乱しているようです。代わりに、すべてのインクルードを cpp ファイルに入れてみてCくださいextern "C"

extern "C" {
  #include "Arduino.h"
}

void setup();
void loop();

void setup()
{
     LED_open();
}

void loop()
{

}
于 2013-05-24T17:38:36.510 に答える
0

ヘッダー ファイルを追加しても、リンカーが確実に関数定義を見つけられるという点では、何の役にも立ちません。つまり、ヘッダー ファイルが与えられた場合、リンカはその定義 (定義が異なる場合) を含むファイルを単独で探し出すことはできません。(ヘッダー ファイルを忘れた場合、「未定義のシンボル」などの行に沿ってコンパイル エラーが発生します。)

.cppそのため、プロジェクトにファイルを含める必要があります (そうしないとエラーが発生します)。あなたは持っていると思います(コメントから、見たばかりです)が、おそらくそうではありません。:) コメントでは、.cファイルが含まれていることを示しています。ここで問題はタイプミスですか?または、宣言と定義の署名が誤って異なる場合があります。

編集:循環ヘッダーの依存関係の結果としてこのエラーが発生したと思いますが、すぐに例を作成できませんでした。とにかく、この場合は非常に可能性が低いです。

于 2013-05-24T17:11:49.053 に答える