有人可以向我解释这个简单的makefile是做什么的

时间:2016-01-30 22:21:28

标签: makefile c

我是C和Make的新手,想知道是否有人可以通过解释这段代码的作用来帮助我。

CC = gcc
C_FLAGS = -Wall -Wextra

all: eecs338

eecs338: eecs338.o
        $(CC) eecs338.o -o eecs338

eecs338.o: eecs338.c
        $(CC) -c $(C_FLAGS) eecs338.c

clean:
        rm -f eecs338 eecs338.o

3 个答案:

答案 0 :(得分:2)

Makefile通常如此组织:

target: dependency
    actions

其中 target 只是一个标签,依赖是另一个目标(或文件;这可能是很多东西), actions 是一旦满足依赖,就可以为目标运行命令。

所以你的Makefile有" all" target(一般默认目标),它依赖于" eecs338_hw01",并且没有操作。 " eecs338_hw01"本身就是一个目标,依赖于" eecs338.o"。现在这个" eecs338.o"是文件名(它是目标); .o扩展名用于目标文件,这通常意味着它是从例如。 .c文件编译而来。

看着" eecs338.o"目标,我们看到它依赖于" eecs338.c"文件。这告诉make查看该依赖文件是否存在。 这个" eecs338.o" target有一些操作,即执行将eecs338.c编译为eecs338.o的命令。

生成eecs338.o文件后,它会满足" eecs338_hw01" target,然后运行操作:从eecs338目标文件创建名为eecs338.o的可执行文件的命令。

因此,您的Makefile提供了一种将eecs338.c编译到eecs338可执行文件中的方法,使用可以在以后添加的规则。

希望这有帮助!

答案 1 :(得分:1)

您一定要按照评论中发布的教程进行操作。但是,如果有人引导您完成它可能会更容易:

前两行定义了两个宏,CC作为gcc编译器,C_FLAGS作为要使用的编译标志。

all:...表示如果输入“make all”,make将检查eecs338_hw01是否为最新且存在。如果没有,它将通过在eecs338_hw01上调用它来“制造”它。

eecs338_hw01:eecs338.o         $(CC)eecs338.o -o eecs338表示如果键入“make eecs388_hw01”,请检查文件eecs338.o是否存在并且是最新的,然后在eecs388_hw01.o上调用gcc的链接器以生成二进制文件eecse338。否则它首先在eecs338.o上调用自己:

eecs338.o:eecs338.c         $(CC)-c $(C_FLAGS)eecs338.c表示检查eecs338.c是否存在并且是最新的。如果是,则使用上面指定的标志调用gcc来预处理,编译和组装eecs338.c到eecs338.o。

最后两行表示如果你调用“make clean”,请在两个文件上调用rm -f,删除它们。

答案 2 :(得分:0)

CC = gcc # macros/variable definitions
C_FLAGS = -Wall -Wextra

all: eecs338 # rule 'all' with dependancy on eecs338

这告诉make必须执行make all make eecs338。 '使'搜索构建规则' eecs338',规则可以只是源代码文件名' eecs338.c'或Makefile中的规则

eecs338: eecs338.o # rule eecs338, depends on eecs338.o
    $(CC) eecs338.o -o eecs338

尝试满足依赖性' eecs338.o'。如果满足此依赖性,它将执行以下命令($(CC) eecs338.o -o eecs338)。 很明显,这个命令取决于目标文件' eecs338.o'但是你需要告诉你当然。

eecs338.o: eecs338.c # again, rule to make eecs338.o
    $(CC) -c $(C_FLAGS) eecs338.c

clean: # a rule with no dependancies, just executes the command
    rm -f eecs338 eecs338.o

因此,您可以将make视为使用依赖树,该树通过递归调用make来完成。

此外,如果make到达树的叶子,并且它只有依赖项是文件,它将检查那些被修改的文件。如果这不是 的情况,那么'制作'什么都不做,只是退出回到它的来电者,即。在树中上升一级并告诉调用者它没有做任何事情(即没有任何改变)。

树中的下一个节点也只在任何依赖项发生更改时才会执行。 IE浏览器。如果源文件' eecs338.c'没有改变,' eecs338.o'没有重建。由此产生,' eecs338'也没有再次联系,因为它的所有依赖都没有改变。

当然,如果删除了任何文件,即使源中的任何内容都没有被编辑,它也会重建^^

Makefiles还有更先进的技术(静音输出,特殊规则,特殊命令等)。其中一些是GNU Make特定的,因此在您需要高兼容性时不应该使用它。