我正在使用make来构建一个C ++项目。在项目过程中,我想对Makefile进行一些更改。不幸的是,自从我执行make一次后,它一直使用Makefile的特定版本,并且根本没有对这些更改做任何事情。
我已经运行make clean,我已经重命名了makefile,我已经搜索了其他可能被使用的Makefile,但都无济于事。在man的手册页中没有提到任何缓存机制,也没有提到Google上的任何缓存机制。
有没有人知道为什么make没有使用新版本以及我能做些什么呢?我正在编译Ubuntu 12.04.2 LTS(x86_64)盒子,(GNU)制作版本3.81。
更新 一些额外的信息。看来make毕竟是使用了当前版本的makefile。如果我改变了主要目标中的某些东西,它就可以正常工作了。但是如果我在obj /%。o目标中更改某些内容,它就会继续运行相同的命令,无论我对该目标做出什么改变。
可在此处找到完整的Makefile:http://pastebin.com/WK43NRcL
答案 0 :(得分:3)
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命令)
答案 1 :(得分:2)
make
不会以某种方式神奇地跟踪你的旧makefile;它将在当前目录中使用它所查找的文件列表中的第一个文件。
要找出实际使用的Makefile,请参阅此问题:Getting the name of the makefile from the makefile
由于您使用的是GNU make,请检查其excellent manual on what filenames it looks for, and in which order。