【问题标题】:Make uses old MakefileMake 使用旧的 Makefile
【发布时间】:2013-08-20 09:44:27
【问题描述】:

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

【问题讨论】:

  • 你如何执行make,即你的命令行是什么?
  • 我试过“make”,我试过“make -f Makefile”,我试过“make -f Makefile all”和“make -f Makefile api”(api是名字的主要目标,它调用其他目标)。这让我想到:我尝试从主目标中删除未更新的目标,这确实有效。所以似乎子目标出了点问题。我将在下面发布整个 makefile。
  • 可能你的所有目标都已构建,而它们都不依赖于Makefile
  • Pastebin 可能是更好的方法,所以这里是链接:pastebin.com/zWskMr43 违规目标是 obj/%.o
  • “冒犯的目标”是什么意思?该目标发生了什么或没有发生什么?预期结果和实际结果?

标签: c++ linux makefile gnu-make


【解决方案1】:
CC_FILES        = $(shell find -name "*.cc" -exec echo "{}" +;)

那个find 命令不正确,它不应该在src 目录中查找吗?既然find 是这样做的,为什么还要使用echo 来打印名称?

这意味着您的CC_FILES 列表和OBJ_FILES 列表也是空的。

我想你想要:

CC_FILES        := $(shell find src -name "*.cc")

请注意,这里使用的是:= 而不是=,否则每次引用CC_FILES 变量时都会运行shell 函数。使用:= 意味着它只运行和评估一次。

但是,由于您的所有 .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 $@ $<

我认为您需要阅读 $&lt; 变量扩展为的内容,因为上面的规则不会达到您的预期。

这个makefile充满了错误,你需要在模式规则中使用echo来打印出变量的值,这样你就可以验证它们是否有你期望的值。 (作为调试的另一个选项,设置SHELL=bash -x 以便回显每个shell 命令)

【讨论】:

  • 你是我的英雄!我不太擅长 makefile(如您所见),所以我从另一个 makefile 复制 CC_FILES 行和 $
【解决方案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

【讨论】:

  • 看来它毕竟使用了正确的文件(另请参阅我的问题中的 cmets),所以这不是问题。还是谢谢!
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2015-03-19
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多