有人可以帮助解决这个问题。当我尝试使我的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
感谢所有在旅途中尽力帮助我的人
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的规则和配方。好吧,这很难读,但是在这种困难的情况下还是值得的。