LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1254|回复: 15

请教Makefile

[复制链接]
发表于 2004-8-19 23:24:51 | 显示全部楼层 |阅读模式
EXECUTABLE=hello
CC=gcc
CPPFLAGS=
CFLAGS=-Wall -02
CXXFLAGS=$(CFLAGS)
COMPILE=$(CC) $(CPPFLAGS)$(CFLAGS) -c

SRCS:=$(wildcard *.c)
OBJS:=$(patsubst %.c , %.o , $(SRCS))
DEPS:=$(patsubst %.c , %.d , $(SRCS))

all(EXECUTABLE)

$(EXECUTABLE)(DEPS) $(OBJS)
        $(CC) -o $(EXECUTABLE) $(OBJS)

%.d:%.c
#       $(CC) -M $(CPPFLAGS) $< > $@
        $(CC) -M $(CPPFLAGS) $< |sed s/\\.o/.d/ > $@

%.o:%.c
        $(COMPILE) -o $@ $<
-include $(DEPS)
运行make的话就会hello.c:3: *** missing separator.  Stop.这样的错误.
如果我把-include $(DEPS)注释掉就没有这样的错误了.
现在我编译的只有一个hello.c文件
发表于 2004-8-20 08:42:34 | 显示全部楼层
$(COMPILE) -o $@ $<
-include $(DEPS)
放到同一行
$(COMPILE) -o $@ $< -include $(DEPS)
 楼主| 发表于 2004-8-20 11:45:56 | 显示全部楼层
为什么我执行了
OBJS:=$(patsubst %.c , %.o , $(SRCS))
DEPS:=$(patsubst %.c , %.d , $(SRCS))
这两句,为什么$(OBJS)和$(DEPS)的值还是*.c?
 楼主| 发表于 2004-8-20 22:48:28 | 显示全部楼层
请各位大虾指点一下啊
发表于 2004-8-21 10:34:16 | 显示全部楼层
最初由 icoming 发表
为什么我执行了
OBJS:=$(patsubst %.c , %.o , $(SRCS))
DEPS:=$(patsubst %.c , %.d , $(SRCS))
这两句,为什么$(OBJS)和$(DEPS)的值还是*.c?

你是怎么知道$(OBJS)的值是*.c的?
我这里一切正常。
 楼主| 发表于 2004-8-21 16:17:56 | 显示全部楼层
我一开始目录下的文件是:
[zd@localhost devel]$ ls
hello.c  Makefile

[zd@localhost devel]$ make
gcc -o hello hello.c

[zd@localhost devel]$ ls
hello  hello.c  Makefile

make的时候没有执行
%.d:%.c
        $(CC) -M $(CPPFLAGS) $< > $@
        $(CC) -M $(CPPFLAGS) $< |sed s/\\.o/.d/ > $@

%.o:%.c
        $(COMPILE) -o $@ $< -include $(DEPS)
而是执行了gcc -o hello hello.c
这不说明了我的$(DEPS) $(OBJS)还是*.o吗?
发表于 2004-8-21 19:22:40 | 显示全部楼层
呵呵,有时候一些看起来不起眼的小问题对于没有经验的人来说会成为大难题。
看看你的规则是怎么写的:

  1. OBJS:=$(patsubst %.c , %.o , $(SRCS))
  2. DEPS:=$(patsubst %.c , %.d , $(SRCS))
复制代码

不知道你注意到没有,在%c和后面的逗号之间,不是多了一个空格吗?
删除掉就是了。
其实完全可以不要空格,直接写成这样:

  1. OBJS := $(patsubst %.c,%.o,$(SOURCE))
复制代码

同时你的DEPS也写得有问题,应该是:

  1. DEPS := $(patsubst %.o,%.d,$(OBJS))
复制代码

论坛里的这篇介绍Makefile的文章建议你参考一下:
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=40431
 楼主| 发表于 2004-8-21 21:57:21 | 显示全部楼层
果然.谢谢啦!
写c写习惯了,写参数的时候总喜欢用空格
 楼主| 发表于 2004-8-21 22:07:48 | 显示全部楼层
还有一个问题:
$(COMPILE) -o $@ $<和-include $(DEPS)
是写在一行还是两行?
如果是写在两行的话我改变.h文件好像不会引起.c文件被重新编译一遍.
而如果写在一行会出现一大堆的错误.
请问这是怎么回事?
 楼主| 发表于 2004-8-25 21:19:18 | 显示全部楼层
情大家帮帮忙啦.
谢谢了
实在是搞不懂!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表