Makefile基础知识

时间:2012-03-18 21:44:38

标签: c makefile

我遇到了makefile的基础知识。

我使用gcc编译

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

lab
labM.o
labG.o
clean

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

labM.c
labM.o
labG.c
labG.o

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

我尝试了什么

labMakefile: labM.o labG.o

但它只是说labMakefile:: command not found

2 个答案:

答案 0 :(得分:6)

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

您正在使用C(根据文件名的后缀判断)。因此,要从labM.o创建labM.c,您可能会使用类似

的命令
gcc -c labM.c -o labM.o

(并非真的需要-o labM.o,这是默认行为,我只是想稍微解释一下。)同样建立labG.o你会使用

gcc -c labG.c -o labG.o

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

gcc labM.o labG.o -o lab

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

rm -f *.o lab

所以要做到这一切,你要编写一个名为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

然后你可以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

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

这需要很多东西,并且可以进一步改进(依赖性处理可以非常光滑),但这是一个良好的开端。

答案 1 :(得分:2)

要运行makefile,必须调用“make”

如果你的makefile没有标准名称(makefile或Makefile),你应该用-f参数指定它:

make -f labMakefile