makefile尝试进行自我编译

问题描述 投票:0回答:1

有人可以帮助解决这个问题。当我尝试使我的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的makefile。三个名为:doc include和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

感谢所有在旅途中尽力帮助我的人

c macos makefile compilation
1个回答
0
投票
我可以用您的Makefile重现此行为,我很惊讶,因为我以前从未见过这种情况。花了一些时间才找到原因。

Make有几个内置规则,包括%:%.o。 Makefile本身是要注意的内部依赖项之一。并且由于您具有定义依赖项%.o:$(C_SOURCES)的通用规则,因此Make构造了从C源代码到Makefile的路径。

这就是为什么它想从它认为是从您的来源构建的Makefile中生成Makefile.o

将您的编译规则更改为

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

并且您不仅将此规则限制为仅适用于您的目标文件,而且还将每个源都分配给了其目标文件。

您的规则%.o:$(C_SOURCES)错误。它定义每个单个目标文件都依赖于源的[[all。此规则的配方还将在其命令行上获取

all源文件。

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

-n仅打印命令,但

    not
执行它们。这对于重建Makefile的命令不是正确的。这些总是执行,IIRC。
  • -d打印很多调试内容,包括决定为什么考虑要构建某些文件。
  • -p打印出make的规则和配方。好吧,这很难读,但是在这种困难的情况下还是值得的。
  • © www.soinside.com 2019 - 2024. All rights reserved.