main.c如何包含其它.c文件

做一个码农都是奢望 2012-07-18 11:19:44
目前有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中已经定义了

//Prototypes
inline 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 *);
...全文
594 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
尽管帖子已经结了,还是有1个问题请教:

1.如果自己定义的.h文件,会被多个.c文件调用,怎么处理?
例如sd.c中需要调用自定义的 uart.h文件,我在其头文件sd.h中#include"uart.h";
在main.h中也#include"uart.h";

编译时就会报错,报uart.h中的函数重复定义了!!

请问如何处理自定义的.h文件被不同.c文件调用问题。

谢谢!!


[Quote=引用 5 楼 的回复:]
1、.c包含实现代码,如mmc.c
2、.h包含函数声明或变量声明(全局),如sd.h
3、使用时,直接include相应的头文件即可,不用包含.c文件。

为方便项目的管理,可以统一将.h放到Inc目录(名称自定),在.c包含文件时,可以使用相对路径,比如#include "../Inc/foo.h",或者在你的IDE中设置头文件搜索目录,或者在Makefile中用-I指定头文件路径。
……
[/Quote]
aydf1 2012-07-19
  • 打赏
  • 举报
回复
只要include .H文件就可以了,C文件添加到项目source file就可以了
  • 打赏
  • 举报
回复
谢谢!!

一直不知道如何处理这些文件。

另外:是否需要将 这些辅助文件放到一个文件夹,如include 文件。

然后 直接 #include, 还需要添加路径吗?
[Quote=引用 3 楼 的回复:]

对的,只要include .H文件就可以了,C文件添加到项目source file就可以了,可以参考vc的文件管理
[/Quote]
dceacho 2012-07-18
  • 打赏
  • 举报
回复
对的,只要include .H文件就可以了,C文件添加到项目source file就可以了,可以参考vc的文件管理
  • 打赏
  • 举报
回复
是否是 在 main.c中 只需要 包含 所有.h文件。对 .c文件不包含,添加到 source file即可?
  • 打赏
  • 举报
回复
报错提示:

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
Donbor 2012-07-18
  • 打赏
  • 举报
回复
顶楼上,很不错!
  • 打赏
  • 举报
回复
谢谢,你解释的很透彻。学习了!!

我用的winavr。

[Quote=引用 5 楼 的回复:]

1、.c包含实现代码,如mmc.c
2、.h包含函数声明或变量声明(全局),如sd.h
3、使用时,直接include相应的头文件即可,不用包含.c文件。

为方便项目的管理,可以统一将.h放到Inc目录(名称自定),在.c包含文件时,可以使用相对路径,比如#include "../Inc/foo.h",或者在你的IDE中设置头文件搜索目录,或者在Makefile中用-I指定头文件路径。……
[/Quote]
李迟 2012-07-18
  • 打赏
  • 举报
回复
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。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧