-1

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

4

2 回答 2

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在同一个目录中,因此您不需要 recursive 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充满了错误,你需要使用echoin模式规则来打印出变量的值,这样你就可以验证它们是否有你期望的值。(作为调试的另一个选项,设置SHELL=bash -x为回显每个 shell 命令)

于 2013-08-20T10:14:18.837 回答
2

make不会以某种方式神奇地跟踪您的旧 makefile;它将使用当前目录中它查找的文件列表中的第一个文件。

要找出实际使用的 Makefile,请参阅以下问题:Getting the name of the makefile from the makefile

由于您使用的是 GNU make,请查看其出色的手册,了解它查找的文件名和顺序

于 2013-08-20T09:51:51.420 回答