目前有sd.h,mmc.c, main.c文件。其中 sd.h定义了sd.c的函数原型以及部分变量;
如何在main.c中包含 sd.h,mmc.c文件?main.c与其它 .c文件,.h文件应该如何管理。
我的方法是,
1. 在mmc.c中 #include "sd.h";包含函数原型定义
2.用一个 main.h文件,其中 #include "sd.h";
3. 在main.c中 #include "main.h".
结果编译时 报错, 对mmc.c中函数报 没有声明? 为什么。因为 sd.c已经包含了 sd.h,而sd.h已经对 sd.c的函数原型申明了。
报错如下,细看后 意思是说:重复定义了!!
G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:172: multiple definition of `SD_read_byte'
main.o:G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:172: first defined here
mmc.o: In function `SD_write_byte':
G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:205: multiple definition of `SD_write_byte'
main.o:G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:205: first defined here
mmc.o: In function `SD_write_command':
G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:144: multiple definition of `SD_write_command'
main.o:G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:144: first defined here
mmc.o: In function `SD_init':
G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:26: multiple definition of `SD_init'
main.o:G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:26: first defined here
mmc.o: In function `SD_write_sector':
G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:227: multiple definition of `SD_write_sector'
main.o:G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:227: first defined here
mmc.o: In function `SD_read_block':
G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:277: multiple definition of `SD_read_block'
main.o:G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:277: first defined here
mmc.o: In function `SD_read_sector':
G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:307: multiple definition of `SD_read_sector'
main.o:G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:307: first defined here
mmc.o: In function `SD_read_cid':
G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:328: multiple definition of `SD_read_cid'
main.o:G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:328: first defined here
mmc.o: In function `SD_read_csd':
G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:339: multiple definition of `SD_read_csd'
main.o:G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:339: first defined here
mmc.o: In function `SD_read_byte':
G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../mmc.c:172: multiple definition of `SPI_Mode'
main.o:G:\work\avr\avrl lesson\ceshi\SD\ver1.5 zj write\default/../uart_new.h:49: first defined here
make: *** [MMCSD.elf] Error 1
但是 sd.h中已经定义了
- C/C++ code
//Prototypesinline U08 SD_read_byte(void);inline void SD_write_byte(U08);extern void SD_read_block(U08 *,U08 *,U16);extern U08 SD_init(void);extern U08 SD_read_sector (U32,U08 *);extern U08 SD_write_sector (U32,U08 *);extern U08 SD_write_command (U08 *);extern U08 SD_read_csd (U08 *);extern U08 SD_read_cid (U08 *);
------解决方案--------------------
对的,只要include .H文件就可以了,C文件添加到项目source file就可以了,可以参考vc的文件管理
------解决方案--------------------
1、.c包含实现代码,如mmc.c
2、.h包含函数声明或变量声明(全局),如sd.h
3、使用时,直接include相应的头文件即可,不用包含.c文件。
为方便项目的管理,可以统一将.h放到Inc目录(名称自定),在.c包含文件时,可以使用相对路径,比如#include "../Inc/foo.h",或者在你的IDE中设置头文件搜索目录,或者在Makefile中用-I指定头文件路径。
从你的信息看出来是AVR单片机,不知道是ICC还是WinAVR。几年前搞AVR时是用WinAVR的,当时是用Makefile来管理工程,并未使用IDE。