首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

打破沙锅问到底,再问Makefile,该如何解决

2013-04-20 
打破沙锅问到底,再问Makefile之前问过一贴(大家可以不必看这贴,直接看下面更简略的问题描述)有大神给出了

打破沙锅问到底,再问Makefile
之前问过一贴(大家可以不必看这贴,直接看下面更简略的问题描述)
有大神给出了 gcc -o main *.c 这样一句,完全搞定的做法.但这样做就像让我用IDE,不管编译的问题,写完代码, 一点编译、运行就出结果了,还是得不到我想要的.

这里再重申一下大概的问题描述.

main.c主函数文件
a.h/a.c
b.h/b.c

b文件组(指b.h/b.c)里实现了一堆功能(函数),按最正常的方式,在.h中声明函数,在.c中定义函数.
a文件组,调用b文件组里的函数、变量.

main.c里只include a.h,通过调用a.h里的函数,就能间接的调用b文件组里的函数.


这里有问题一,在实现a文件组的时候,a.h里include b.h和a.c文件里include b.h,有什么区别?

之前我认为,a.h里include b.h,将允许main.c文件里也能调用b.h的函数.而仅在a.c里include b.h,main里不能调用b.h里的函数.事实证明这是是错的,我在eclipse上测试,两种情况都能调用.我很疑惑,这是为什么?而Makefile文件怎么写,能做到这点?
[解决办法]
你之前的帖子我已经给你回复了,我把我写的最简单的源文件也贴出来了,方便你的理解

[解决办法]
直接这样就可以了啊:

gcc main.c a.c b.c -omain

[解决办法]
include .h 文件只是让编译器可以看到函数的声明, 在调用的时候做类型检查.
C++ 语言的类型检查很强, 如果调用函数的时候, 没有见过这个声明则编译出错.
C 语言的类型检查不是强制性的, 如果没有看到函数的声明, 就直接忽略类型检查继续编译. 所有, 在没有 include 头文件的情况下, 你也可以调用函数, 并且还可以用错误的参数来调用函数! 所以这样其实是非常危险的.

举例说明:



int func(int x, int y);

int f()
{
func(10);
return 0;
}


编译会失败, 但是:


//int func(int x, int y);

int f()
{
func(10);
return 0;
}


编译时可以成功的, 只是可能收到一条警告:
warning : 'func' undefined; assuming extern returning int
[解决办法]
CC = gcc
OBJDIR = ./OBJ
如果源文件的目录不同可以分别指定目录
SRCS = $(wildcard ./a/*.c ./b/*.c)
源文件在不同目录用
OBJS = $(patsubst %.c,$(OBJDIR)/%.o,$(SRCS)) 
源文件在同一目录用
OBJS = $(patsubst %.c,$(OBJDIR)/%.o,*.c) 

XXX : $(OBJS)
    $(CC) -c  -o $@ $^

%.o: %.c 
    $(CC) -o $@ -c $< 
[解决办法]
a.h里include b.h容易形成include的间接嵌套。


引用:
引用:直接这样就可以了啊:
Plain Text code?1gcc main.c a.c b.c -omain我的问题是红色字的部分

在实现a文件组的时候,a.h里include b.h和a.c文件里include b.h,有什么区别?

[解决办法]
main: main.o a.o b.o
gcc -o main main.o a.o b.o
main.o: main.c
gcc -c main.c
test.o: a.c
gcc -c a.c
st.o: b.c
gcc -c b.c

热点排行