我正在使用make来构建C ++项目。在项目过程中,我想对Makefile进行一些更改。不幸的是,自从我执行一次make以来,它一直使用那个特定版本的Makefile,并且根本不做任何更改。
我已经运行make clean,我已经重命名了makefile,我搜索了其他可以代替使用的Makefile,但无济于事。在make的手册页中没有提及任何缓存机制,在Google的任何地方都没有提及。
有谁知道为什么make不使用新版本以及我该怎么做?我正在使用(GNU)make版本3.81的Ubuntu 12.04.2 LTS(x86_64)盒进行编译。
更新:一些其他信息。似乎make毕竟使用的是makefile的当前版本。如果我更改主要目标中的某些内容,则效果很好。但是,如果我更改obj /%。o目标中的内容,则无论我对该目标进行什么更改,它都将继续运行相同的命令。
完整的Makefile可以在这里找到:http : //pastebin.com/WK43NRcL
CC_FILES = $(shell find -name "*.cc" -exec echo "{}" +;)
该find
命令不正确,是否应该在src
目录中查找?那为什么还要用它echo
来打印名称find
呢?
这表示您的清单,CC_FILES
因此的清单也OBJ_FILES
为空。
我想你要:
CC_FILES := $(shell find src -name "*.cc")
请注意,这:=
不会使用,=
因为否则shell
每次引用CC_FILES
变量时该函数都会运行。使用:=
表示它仅运行和评估一次。
但是,由于似乎所有.cc
文件都在同一个目录中,因此不需要递归find
,只需执行以下操作:
CC_FILES := $(wildcard src/*.cc)
如您所知,您patsubst
已经坏了,您可以执行以下操作:
OBJ_FILES := $(patsubst src/%.cc,obj/%.o,$(CC_FILES))
(再次,:=
在这里使用)
还:
obj/%.o: obj src/%.cc
$(CXX) $(CFLAGS) -c -o $@ $<
我认为您需要阅读$<
变量扩展到的内容,因为上面的规则不会满足您的期望。
这个makefile充满了错误,您需要echo
在模式规则中使用以打印出变量的值,以便可以验证它们是否具有期望的值。(作为调试的另一个选项,设置SHELL=bash -x
为回显每个shell命令)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句