我真的很难理解以下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文件的文件夹中执行。它应该构建src和build文件夹,将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] 删除。
我来说两句