###前提・実現したいこと
組み込み系のソフト開発で、GNUツールチェーンでの開発環境構築を試みています。
CYPRESSのアプリケーションノートを参考に、Makefileを記述しCソースのコンパイルをしようとしているのですが、インクルードしたヘッダファイル内で#define
されているはずの変数が、undeclared
でエラーになります。
なお問題の変数は、EEPROM領域のデータを読み出して変数として定義したものです。
EEPROM領域というのは、マイコンメモリのflash領域の一部をEEPROMとみなしてデータを格納している部分という大雑把な認識なのですが、不正確ならすみません。
申し訳ありませんが対象のプロジェクトは外部に出せないものなので、以降それをイメージした簡易なプロジェクト例で説明させていただきます。また、この簡易プロジェクトだと同様のエラーを再現できていませんので、あくまでイメージとさせてください。
###問題の内容
makeでヘッダファイルを見つけられていないなら、エラー内容は
source_b/Ret.c:1:10: fatal error: 'header_a.h' file not found #include "header_a.h" ^ 1 error generated.
というようなものになると思うのですが、実際には
source_b/Ret.c:3:12: error: `HEADER_A' undeclared (first use in this function) int x = HEADER_A * 2; ^ 1 error generated.
というエラーが出ています。
このように、Makefileでインクルードされているヘッダ自体は見つけられているようなのに、そのヘッダ内で#define
されている変数は探せていないというのは、どういう場合が考えられるのでしょうか?
###再現のための簡易プロジェクト
ディレクトリ構成
TestProject┬─/header_a/─header_a.h │ ├─/source_a/─Main.c │ ├─/source_b/─Ret.c │ ├─/dep/─Main.o.d │ └─Ret.o.d │ └─Makefile
Makefile
1CC = gcc 2AS = as 3LD = ld -v 4CP = gobjcopy 5 6PROJECT = test-mf 7 8SRC = $(shell find source_a source_b -name *.c) 9ASRC = $(shell find source_a source_b -name *.s) 10INCDIR = -I./header_a 11OBJS = $(SRC:.c=.o) $(ASRC:.s=.o) 12 13OPT = -O0 14 15CPFLAGS+= -Wall 16CPFLAGS += -MD -MP -MF ./dep/$(@F).d 17 18all:ROM 19ROM: ASFLAGS += eedefsym Debug_RAM=0 20ROM: clean $(OBJS) $(PROJECT)_rom.elf $(PROJECT)_rom.hex 21ROM: $(PROJECT)_rom.bin 22 23%.o : %.c 24 @echo "--compiling--" 25 $(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@ 26 27%.o : %.s 28 @echo "--assembling--" 29 $(AS) $(ASFLAGS) $< -o $@ 30 31%rom.elf: $(OBJS) 32 @echo "--linking--" 33 $(CC) $(OBJS) -o $@
Main.c
C
1int main(void){ 2 extern int ret_a(void); 3 int a = ret(); 4 5 return 0; 6} 7
Ret.c
C
1#include "header_a.h" 2int ret_a(void){ 3 int x = HEADER_A * 2; 4 int y = HEADER_B * 2; 5 return x + y; 6}
header_a.h
C
1#define HEADER_A eeprom_data[0x01] * 10 //EEPROM領域のデータ 2#define HEADER_B eeprom_data[0x02] * 10
###補足情報(言語/FW/ツール等のバージョンなど)
C言語
GNUツールチェーン
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/18 05:26
2016/12/19 03:53
2016/12/21 10:25