当我说非常简单时,我的意思是。我有一个main.c和一个名为input_error.h的头文件。
main.o : main.c input_error.h
gcc -c main.c
当我运行命令“make”时,执行gcc -c main.c但它没有更新我对main.c文件所做的任何更改。当我手动输入“gcc main.c”时,它工作正常。
编辑:似乎我需要添加另一条规则,但我不确定是什么需要答案 0 :(得分:2)
目前你的makefile只构建.o文件。您可以通过两种方式构建二进制文件。请注意,make要求targets语句中的缩进是一个制表符而不是4个空格,因为它可能已被浏览器转换为。
分别构建.o
然后链接二进制文件。请注意,使用-c
开关会导致gcc仅构建目标文件。
main: main.o
gcc main.o -o main
main.o : main.c input_error.h
gcc -c main.c -o main.o
一步构建
main: main.c input_error.h
gcc main.c -o main
您还可以通过使用特殊变量来表示目标($ @),第一个依赖项($<)和所有(@ ^)依赖项来避免makefile中的重复。
e.g。以上一行可能成为
main.o : main.c input_error.h
gcc -c $< -o $@
一开始看起来有些神秘,但你会习惯它。 @kaylums答案中的隐含规则也有助于减少打字。
答案 1 :(得分:2)
Makefile只有一个规则来编译.o
文件。也就是说,它没有任何规则来链接最终的可执行文件。
make
具有构建许多共同目标的隐含规则。所以你的Makefile可以简单如下:
all: main
main.o : input_error.h
进一步说明:
all: main
:由于这是第一个目标,因此如果没有向make
命令行提供显式目标,则默认情况下将构建该目标。它取决于单个目标main
。main
没有明确的规则,但make
有一个隐式规则,可以从main.c
构建它。main.o : input_error.h
:告诉make
main.o
如果input_error.h
发生变化,则需要重建main.c
。由于make
具有隐含的知识,因此无需将make
放在此处。也不需要显式命令,因为 .floating-block{
position: fixed;
top: 25%;
right: 25%;
width: 50%;
border: 3px solid red;
background-color:white;
}
也有隐含的命令。