Makefile基础知识

JA3*_*A3N 3 c makefile

我在makefile的基础知识方面遇到了麻烦.

我用gcc编译

我需要做的是创建一个名为labMakefile的makefile,目标是

lab
labM.o
labG.o
clean
Run Code Online (Sandbox Code Playgroud)

已经在我正在处理的文件夹中的文件包含

labM.c
labM.o
labG.c
labG.o
Run Code Online (Sandbox Code Playgroud)

我一直在看makefile教程但我似乎无法找到创建makefile的正确方法

我试过的

labMakefile: labM.o labG.o
Run Code Online (Sandbox Code Playgroud)

但它只是说 labMakefile:: command not found

Bet*_*eta 6

makefile是由Make运行的脚本.它只是一个用严格语法编写的文本文件,它需要像源代码一样(虽然它被解释,但没有编译).您可以使用任何您喜欢的文本编辑器来创建它.

您正在使用C(根据文件名的后缀判断).所以labM.olabM.c你创建可能会使用像这样的命令

gcc -c labM.c -o labM.o
Run Code Online (Sandbox Code Playgroud)

(并不是-o labM.o真的需要它,这是默认行为,我只是试图拼出一些东西.)同样建立labG.o你的使用

gcc -c labG.c -o labG.o
Run Code Online (Sandbox Code Playgroud)

然后(我猜)你将它们连接在一起构建实验室:

gcc labM.o labG.o -o lab
Run Code Online (Sandbox Code Playgroud)

有时你想清除构造的文件:

rm -f *.o lab
Run Code Online (Sandbox Code Playgroud)

所以要做到这一切,你要写一个Makefile看起来像这样的makefile (注意前导空格是TAB):

labM.o:
    gcc -c labM.c -o labM.o

labG.o:
    gcc -c labG.c -o labG.o

lab:
    gcc labM.o labG.o -o lab

.PHONY:clean
clean:
    rm -f *.o lab
Run Code Online (Sandbox Code Playgroud)

然后你可以make labmake cleanmake labM.o labG.o.如果你真的想调用这个makefile labMakefile,你可以这样做,但是你必须这样做make -f labMakefile lab.这个makefile粗糙但有效.它可以大大改善:

CC = gcc

lab: labM.o labG.o
    gcc $^ -o $@

lab%.o: lab%.c
    $(CC) -c $< -o $@

.PHONY:clean
clean:
    @echo cleaning things up, boss...
    @rm -f *.o lab
Run Code Online (Sandbox Code Playgroud)

这将更好地处理依赖关系:如果你修改labM.c但不是labG.c,然后make,Make将知道必须重建labM.o(和lab),但labG.o不必.

这需要很多,并且可以进一步改进(依赖处理可以非常流畅),但这是一个良好的开端.