我是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
答案 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特定的,因此在您需要高兼容性时不应该使用它。