2017-04-23 3 views
0

を検索するようにしてください教えてどのように、私は単純に行くだろう。しかし、私が上記のコマンドをMakefileに入れるとすぐに、DDRCPC2、およびPORTCというコンパイルエラーが返されます(下のエラーチャンクを参照)。これらの定数はavr/io.hで定義されているので、ヘッダファイルを指すように-Iパラメータを設定しようとしましたが、成功しませんでした。ここに私のMakefileは次のとおりです。は、私はシンプルなAVRのCプログラムをコンパイルしたい場合はヘッダファイル

CC=avr-gcc 
INCLUDE=-I/usr/avr/include 
CCFLAGS+=$(INCLUDE) 

build: avr.o 
    $(CC) -mmcu=atmega2560 -Os avr.c -o avr.o 

私は同様の問題hereを見つけましたが、私は解決策を適用する幸運ではなかったです。私は問題がavr-gccにあり、必要なライブラリが見つからないと思っています。私は-Iディレクティブがそれを並べ替えると思いました。しかし、私は見つけることができない愚かな間違いをしているようです。ヘッダーファイルのあるMakefileを伝える正しい方法は何でしょうか?

make buildを呼び出したときにのみ起こるエラーメッセージ:

avr.c: In function 'main': 
avr.c:17:5: error: 'DDRC' undeclared (first use in this function) 
    DDRC |= 1<<PC2; /* PC2 will now be the output pin */ 
    ^~~~ 
avr.c:17:5: note: each undeclared identifier is reported only once for each function it appears in 
avr.c:17:16: error: 'PC2' undeclared (first use in this function) 
    DDRC |= 1<<PC2; /* PC2 will now be the output pin */ 
       ^~~ 
avr.c:19:9: error: 'PORTC' undeclared (first use in this function) 
     PORTC &= ~(1<<PC2);/* PC2 LOW */ 
     ^~~~~ 
make: *** [<builtin>: avr.o] Error 1 
*** Failure: Exit code 2 *** 

avr.c私はmakeを使用してコンパイルしようとしています:あなたのメイクファイルで

#define F_CPU 100000000 
#include <avr/io.h> 
#include <util/delay.h> 

void sleep(uint8_t millisec) 
{ 
    while (millisec) { 
     _delay_ms(1);/* 1 ms delay */ 
     millisec--; 
    } 
} 

int main() 
{ 
    DDRC |= 1<<PC2; /* PC2 will now be the output pin */ 
    while (1) { 
     PORTC &= ~(1<<PC2);/* PC2 LOW */ 
     sleep(100);/* 100 ms delay */ 
     PORTC |=(1<<PC2); /* PC2 HIGH */ 
     sleep(100);/* 100 ms delay */ 
    } 
    return 0; 
} 
+1

は、注:ledblink.cとavr.cは同じではありません(少なくとも名前は異なります)。私はあなたの声明を信じていません、それは同じコマンドがMakefileで使われるとき、それはコンパイルされません。 Makefile(CC、INCLUDE、CCFLAGSはありません)と同じコマンドを使用して、それが動作するかどうかを教えてください。 – Jens

+0

ledblink.c/avr.cが私のコピー貼り間違いでした - 質問でそれを修正しました。 2番目のビット、はい、そうです。それは問題であったCCではなく、むしろ 'build:avr.o'でした。私はそれを 'build:'に置き換えました。そして今コンパイルされます。私はちょうどこの場合は私に無関係と思われるエラーメッセージでうんざりしています。助けてくれてありがとう! – chao

答えて

3

このラインはあなたの問題の原因である:

build: avr.o 

これはどういう意味ですか?それは、buildという名前のターゲットを作成するために、avr.oという名前のターゲットが存在するかどうかを調べる必要があります。存在しない場合は作成してください(そうする方法が分かっている場合) 。

このルールのレシピを実行しようとする前に、FIRSTファイルavr.oを作成しようとします。

あなたはそのようなファイルの作成方法を教えていませんが、幸いにも(または不運にも)makeには、それが知っているいくつかのタイプのファイルを作成するために使用できる組込みルールがあります。これらの組み込み規則の1つは、makeがファイル*.o*と一致する一部の文字列)を作成し、ファイル*.c(は*.oと同じです)を見つけることができれば、これで*.oを作成できますレシピ:

$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o [email protected] $< 

これはどのように展開しますか?さて、CCavr-ccに設定したので、そのコンパイラを使用します。 CFLAGSCXXFLAGS、またはTARGET_ARCHを設定していないので、これらの変数にはデフォルト値が使用されます。これは何もありません。あなたはエラーメッセージのリストの一番上を見上げるならば、それが実行コンパイル行が印刷されますし、あなたはそれはあなたが望んでいたコンパイル行ではありません表示されます作る

avr-cc -c -o avr.o avr.c 

:だから、それはこのコンパイル行が実行されます実行する。

この問題を解決する方法はたくさんあります。

一つのオプションは、あなたの変数を維持し、自分のルールを修正することです:

ここ
CC=avr-gcc 
INCLUDE=-I/usr/avr/include 
CCFLAGS+=$(INCLUDE) 

build: avr.c 
     $(CC) $(CCFLAGS) -mmcu=atmega2560 -Os avr.c -o avr.o 

それがあなたのレシピ(それからの.oを構築期待するものだから、私たちは、avr.cないavr.oとしてbuild前提条件をリストします。 c。したがって、.cが前提条件です)。しかし、これは実際には非常に悪いメークファイルです。 makeと入力するたびに、avr.oファイルが再構築されるため、「makeの役に立たない使用」です。あなたが持っているすべてですそれ

CC = avr-gcc 
CPPFLAGS = -I/usr/avr/include 
CFLAGS = -mmcu=atmega2560 -Os 

build: avr.o 

良い方法ではなく、独自の変数の標準定義済みの変数設定を使用するようにメイクファイルを修正し、その組み込みルールとオブジェクトファイルをビルドしてみましょうすることです(単純なAVR Cプログラムをビルドすると言うが、あなたのmakefileはオブジェクトファイルをコンパイルするだけでリンカーを起動しないので、あなたがしたいことはまったく分かりません)。

あなたが本当に独自のルールを守り、組み込みのルールを使用しないようにしたい場合はレシピによって構築されたファイルは、メイクファイルルールでターゲットであるように、そして、少なくとも、それを正しく書く:

CC=avr-gcc 
INCLUDE=-I/usr/avr/include 
CCFLAGS+=$(INCLUDE) 

build: avr.o 

avr.o: avr.c 
     $(CC) $(CCFLAGS) -mmcu=atmega2560 -Os avr.c -o avr.o 
+0

これは本当にうまく説明された答えです、ありがとうございます。私はmakeが特定のファイルタイプを扱う方法を独自のルールで組み込んだ「賢い」ことを知らなかった。私はあなたが明示的にあなたに電話するように指示するものだけを呼び出すと思った。いずれにせよ、あなたの答えは魅力のように働くので、もう一度感謝します。 – chao

+0

GNU makeの組み込みルールの一部のリストは、https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.htmlで見ることができます。 'make -pf/dev/null'を実行することで組み込みルール(および変数) – MadScientist

関連する問題