Makefile无法识别模式规则

米歇尔·格里萨菲(Michele Grisafi)

我真的很难理解以下makefile为何不起作用:

all: buildFolders main.out
   mv main.out build/
   -echo "File compiled"

buildFolders:
   mkdir -p build src
   cp *.c src/

%.s: %.c
   gcc -S $< -o $@


%.out: src/%.s
   gcc $< -o $@

它在仅包含makefile和main.c文件的文件夹中执行。它应该构建srcbuild文件夹,将main.c复制src文件夹中,然后开始编译main.out不幸的是,它抛出错误“没有规则可以使目标'main.out'”。由于我具有与“ main.out”匹配的%.out,所以我不明白为什么它会给我该错误。相反,它应该寻找src / main.s文件,创建它,然后使用它生成main.out。我究竟做错了什么?谢谢

疯狂的科学家

你有很多问题。

首先,按顺序列出先决条件不会创建依赖关系。例如,如果您想启用并行构建,则可以执行以下操作:

all: buildFolders main.out

不会强制buildFolders目标之前建立main.out这两个目标都必须在构建之前,all但这并不能使makebuildFolders之间存在任何关系main.out如果buildFolders必须先完成,然后main.out才能构建,则main.out必须将其buildFolders列为前提条件。

其次,您还没有告诉make如何构建文件src/main.c它是作为buildFolders目标的副作用而构建的,但是make不能知道。您需要说明以确保该文件可以存在。我建议添加一条规则:

src/%.c: %.c
        mkdir -p src
        cp $< $@

buildFolders完全删除目标。

但是,我真的质疑为什么您仍然要这样做。将当前目录中的源文件复制到某个子目录以构建它们有什么意义?放置多个源文件副本是危险且令人困惑的,因为它们可能彼此不同步,然后您正在构建较旧的版本,并且花费了数小时来尝试理解为什么某些功能不起作用。这是一个非常糟糕的主意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章