用AVR Studio v4.19,移植别人程序时发现下面的问题:当头文件放在分别的文件夹时,如果用AVR Studio自带生成的makefile,编译会出错,提示“No such file or directory”,用AVR Studio生成的makefile则不会。
产生问题的工程文件目录的结构如下:
D:\EPT\A0
│ LED_DIM0.aps
│
├─Analog
│ analog.c
│ analog.h
│ analog.lst
│ analog.o
│
├─INT0
│ INT0.c
│ INT0.h
│
├─IOSET
│ ioset.c
│ ioset.h
│ ioset.lst
│ ioset.o
│
├─T0
│ T0.c
│ T0.h
│ t0.lst
│ t0.o
│
├─Task
│ task.c
│ task.h
│ task.lst
│ task.o
│
└─WDTSET
│ wdtset.c
│ wdtset.h
│ wdtset.lst
│ wdtset.o
仔细研究之后发现这个问题与不同编译器(WinAVR、AVR Toolchain)生成的makefile文件里,书写子文件夹的格式有关。
1、用Winavr带的mfile工具生成makefile,编译器WinAVR(20100110)或者AVR Toolchain,makefile里面指定源文件时要这样写:
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c ./Task/task.c ./T0/T0.c /./IOSET/ioset.c ./WDTSET/wdtset.c
./Analog/analog.c ./INT0/INT0.c
同时源文件里面#include要这样写:
#include "IOSET/ioset.h"
#include "T0/T0.h"
#include "Analog/analog.h"
#include "WDTSET/wdtset.h"
#include "INT0/INT0.h"
#include "Task/task.h"
或者
#include "..\IOSET\ioset.h"
#include "..\T0\T0.h"
#include "..\Analog\analog.h"
#include "..\WDTSET\wdtset.h"
#include "..\INT0\INT0.h"
#include "..\Task\task.h"
这样编译都能通过。
2、用AVR Studio自己生成的makefile,子文件目录只能这样写:
#include "..\IOSET\ioset.h"
#include "..\T0\T0.h"
#include "..\Analog\analog.h"
#include "..\WDTSET\wdtset.h"
#include "..\INT0\INT0.h"
#include "..\Task\task.h"
另一种写法不能会出错,"No such file or directory"。
还有一种方法:在AVR Studio中Project->Configuration Options选项里,进入Include Directories标签,把包含头文件的文件夹都加入到include列表里。这样c文件中不用写子文件夹名,就能找到头文件,即可写成
#include "ioset.h"
#include "T0.h"
#include "analog.h"
#include "wdtset.h"
#include "INT0.h"
#include "task.h"
至此问题解决。总结问题的根源,在于WinAVR和AVR Toolchain生成的makefile,对子文件夹书写的格式不同,使用时一定要注意。
用户377235 2015-6-12 16:36
用户377235 2013-8-1 07:49
用户276134 2013-5-29 23:07