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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Makefile中的模式规则
  模式规则模式规则类似于普通规则。只是在模式规则中,目标名中需要包含有模式字符“%”(一个),包含有模式字符“%”的目标被用来匹配一个文件名,“%”可以匹配任何非空字符串。规则的依赖文件中同样可以使用“%”,依赖文件中模式字符“%”的取值情况由目标中的“%”来决定。例如:对于模式规则“%.o : %.c”,它表示的含义是:所有的.o文件依赖于对应的.c文件。我们可以使用模式规则来定义
GUN make学习笔记之make显示规则
在上一篇GUN make 学习笔记之make初探中,我们编写了一些规则用于编译和链接我们的程序。每个规则都定义了目标(即被更新的文件)。每个目标文件都依赖一组前提条件(同样也是文件)。当要求更新目标时,make会在任何前提条件被修改且比目标文件新的情况下,执行规则下的命令脚本。因为,每个规则的目标可能是另一规则的前提条件,这样,由目标和前提条件组成的集合将会形成依赖图或者依赖关系(简称依赖图)
从头开始写项目Makefile(八):模式规则
【版权声明:转载请保留出处:blog.csdn.net/gentleliu。Mail:shallnew at 163 dot com】     上一节讲到目录创建成功,目标文件没有生产到对应目录下,这里我们先给目标文件加上对应目录,这样的话产生对应的目标文件会直接生成到对应目录。我们先给库文件目标和可执行文件目标加上路径,如下: lib : $(OBJDIR) $(LIBDIR)/$(SRC_
Makefile中的vpath理解--提示找不到文件
在makefile中,利用vpath和VPATH可以指定makefile中文件
makefile文件的制作
   首页 设置 注册 登陆 培训 Wiki Blog Flash SCM SAP 丛书 书签 资料库 退出    ITPUB论坛 > ≡ 操作系统与硬件 ≡>其它UNIX系统>找到了份挺好的中文 Makefile 的教程, 非常详细清楚. 大家共享.    接收该主题更新信息加此话题到个人收藏好评列表 加入资料库  上一主题   下一主题     作者 主题    [ 9  7  1   
Makefile 没有规则创建目标“main.o”需要的目标“main.c”
问题:Makefile 没有规则创建目标“main.o”需要的目标“main.c” make 命令假设在Makefile文件中的第一个目标“myapp”是想创建的目标文件。然后它会检查其它的依赖关系,并确定需要一个有一个名为“main.c”的文件。由于并未创建该文件,Makefile文件里也就未说明如何创建该文件,所以make的第一条命令报错。下面来创建“main.c文件并重新进行make
makefile超级详细规则
 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefil
make的运行及隐含规则
1. make的运行         一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,想在不同的时候使用不同的编译规则,等等。本章节就是讲述如何使用make命令的。 1.1  make的退出码 make命令执行后有三个退出码:
linux内核的makefile规则
linux内核的makefile规则 linux内核的makefile规则 linux内核的makefile规则
Makefile include 遇到的小问题
项目中有个Makefile, 但是调用 make 不跟任何参数时候执行了一个奇怪的target, 这个target并没有出现在当前的Makefile中,而根据本Makefile的意图,它是想在不跟任何参数时执行一个叫做rpms的target:摘自Makefile:.PHONY: rpms default: rpms仔细查看了一遍Makefile发现在文件的开头有这么一句代码:include $(T...