原创 AVR Studio中关于makefile和头文件路径的问题

2012-4-26 16:35 8817 5 8 分类: MCU/ 嵌入式

       用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,对子文件夹书写的格式不同,使用时一定要注意。

avr

文章评论3条评论)

登录后参与讨论

用户377235 2015-6-12 16:36

这个困扰我许久,见你茅塞顿开

用户377235 2013-8-1 07:49

菜鸟表示看不懂。

用户276134 2013-5-29 23:07

不错,如果project中有好多文件夹就会产生这样的问题。
相关推荐阅读
用户1660679 2012-06-06 15:16
stm8官方库学习笔记 - GPIO
STM8 官方库版本STM8S_StdPeriph_Lib_V2.1.0,GPIO例程GPIO.h中有一个注释遗漏。原版注释为: /** * @brief GPIO modes * * ...
用户1660679 2012-04-26 15:43
AVR快速PWM的一些细节
       快速PWM有两种模式:WGM02:WGM00=3 or WGM02:WGM00=7,两种模式的操作如下。 Mode WGM2 WGM1 ...
我要评论
3
5
关闭 站长推荐上一条 /2 下一条