2 m08090420 m08090420 于 2014.10.07 17:00 提问

makefile模式匹配提示无法找到规则

1.dep_dir := .deps
2.obj_dir := .objs
3.srcs := $(shell find ./ -name "*.c" -o -name "*.cpp")
4.srcs := $(subst ./,,$(srcs))
5.objs := $(patsubst %.cpp,%.o, $(srcs))
6.objs := $(patsubst %.c,%.o, $(objs))
7.dep_dirs := $(addprefix $(dep_dir)/,$(sort $(dir $(objs))))
8.objs := $(addprefix $(obj_dir)/, $(objs))
9.dirs += $(sort $(dir $(objs)))
10..PHONY:all
11.all:$(target)
12.$(target):$(objs)
13. g++ -g -fPIC -o $(target) $(objs) $(library_path)
14.$(obj_dir)/%.o : %.cpp | $(dirs) $(dep_dirs)
15. g++ -c $(macro) $(cflags) $(include_path) -MMD -MP -MF"$(dep_dir)/$(<:.cpp=.d)" -MT"$(dep_dir)/$(<:.cpp=.d)" -o $@ $<
16.$(obj_dir)/%.o : %.c | $(dirs) $(dep_dirs)
17. g++ -c $(macro) $(cflags) $(include_path) -MMD -MP -MF"$(dep_dir)/$(<:.c=.d)" -MT"$(dep_dir)/$(<:.c=.d)" -o $@ $<
请问下这段makefile程序在第一次运行的时候生成第二个.o目标文件会提示找不到规则。不做任何改动再次运行make的时候就能够正常编译。第一次运行结果如下:g++ -c -DDEBUG -ggdb3 -fPIC -Wall -Wshadow -O0 -I. -I../include -MMD -MP -MF".deps/test_main.d" -MT".deps/test_main.d" -o .objs/test_main.o test_main.cpp
make: *** No rule to make target .objs/test.o', needed by../../bin/Debug/server_debug'. Stop.
再次运行如下:
g++ -c -DDEBUG -ggdb3 -fPIC -Wall -Wshadow -O0 -I. -I../include -MMD -MP -MF".deps/test.d" -MT".deps/test.d" -o .objs/test.o test.c
也就是说第一次运行提示.objs/test.o找不到规则,第二次运行又成功的生成了。
还有一个现象就是没有第8行代码并且将模式规则改为%.o:%.c和%.o:%.cpp的时候运行一次就能成功。也就是说将.o文件输出到.c和.cpp相同的目录中不会出现问题。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!