【问题标题】:makefile tries to compile itselfmakefile 尝试自行编译
【发布时间】:2020-03-14 06:25:18
【问题描述】:

谁能帮忙解决这个问题。 当我尝试让我的 makefile 执行此操作时。

`echo ./src/main.c
./src/main.c
gcc -c -g -Iinclude src/main.c
gcc   Makefile.o   -o Makefile
clang: error: no such file or directory: 'Makefile.o'
clang: error: no input files
make: *** [Makefile] Error 1`

实际上,我的目录中只有: 一个名为:Makefile 的生成文件。 三个名为 :doc 的空文件夹包括和 obj。 还有一个名为 src 的文件夹,里面有 main.c。

我的 Makefile 看起来是:

CC := gcc
HEADERS := -Iinclude
C_SOURCES := $(wildcard ./src/*.c)
O_SOURCES := ./obj
OBJ := $(notdir $(C_SOURCES:.c=.o))
C_FLAGS := -Wall -Wextra -Werror
B_FLAGS := -c -g


main:$(OBJ)
    $(CC) $(C_FLAGS) -o $@ $^
    mv $^ $(O_SOURCES)
    mkdir -p bin
    mv main ./bin


%.o:$(C_SOURCES)
    echo $(C_SOURCES)
    $(CC) $(B_FLAGS) $(HEADERS) $^

depend:
    makedepend $(HEADERS) $(C_SOURCES)

tar:
    tar -Jcf b-GoL-$(TAG).tar.xz Makefile $(C_SOURCES) $(HEADERS)

clean :
    @clear
    rm -rf bin $(O_SOURCES)/$(OBJ) b-GoL-$(TAG).tar.xz

感谢所有愿意在我的旅程中帮助我的人

【问题讨论】:

  • 只是一个疯狂的猜测 - 在先决条件之前的冒号后添加一个空格:%.o: $(C_SOURCES)main 目标相同)
  • 还是不行,谢谢
  • 添加echo $^怎么样?
  • 我不复制。你们是如何启动 make 的?
  • 我只写 make 就是这样

标签: c macos makefile compilation


【解决方案1】:

我可以用你的 Makefile 重现这种行为,我很惊讶,因为我以前从未见过这种情况。花了一点时间才找到原因。

Make 有几个内置规则,包括%:%.o。需要注意的内部依赖项之一是 Makefile 本身。而且因为你有一个通用规则定义了一个依赖 %.o:$(C_SOURCES) Make 构造了一条从你的 C 源到 Makefile 的路径。

这就是它想从Makefile.o 生成Makefile 的原因,它认为它是从你的源代码构建的。

把你的编译规则改成

$(OBJ):%.o:src/%.c

您不仅将这条规则限制在您的目标文件中,而且还将每个源分配给它的目标文件。

您的规则%.o:$(C_SOURCES) 是错误的。它将每个对象文件定义为依赖于您的所有源。此规则的配方将在其命令行上额外获取 所有 源文件。

一些提示:使用 make 的选项来查看它的想法。

  • -n 只是打印命令,但 执行它们。这不适用于重建 Makefile 的命令;这些总是被执行,IIRC。
  • -d 打印了很多调试内容,包括决定为什么考虑构建某些文件。
  • -p 打印制作的规则和食谱。嗯,它很难阅读,但在如此困难的情况下值得。

【讨论】:

  • 我现在知道为什么我不能复制了。我的 Makefile 是在源文件之后过时的,因此 make 没有尝试重新制作它。
  • 嗯,您的解决方案看起来比我的要好,感谢您所做的一切。
  • @AProgrammer :-D 是的,我也掉进了那个陷阱。我想知道为什么效果只起作用了一次:我在两者之间编辑了 Makefile 而没有触及main.c
  • 我将删除我的答案,因为我的答案是错误的,再次感谢。
猜你喜欢
  • 2016-03-14
  • 2016-08-08
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多