使用旧的Makefile

时间:2013-08-20 09:44:28

标签: c++ linux makefile gnu-make

我正在使用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

2 个答案:

答案 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