Makefile基础知识

问题描述:

我遇到了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

+0

我怀疑它给你的错误信息,因为它是一个不同的大写字母。当然,除非...... – 2012-03-18 21:47:01

+0

我认为'make -f labMakeFile lab'' – JA3N 2012-03-18 21:48:17

+0

那么,你的makefile被称为'labMakefile'(显然),而不是'labMakeFile',所以有一个问题。第二个问题是你要求它建立目标'lab',但你的makefile没有任何叫做'lab'的目标。 – 2012-03-18 21:52:01

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

您正在使用C(通过您的文件名后缀来判断)。因此,要建立labM.olabM.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是这个样子(注意前导空格选项卡):

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 [email protected] 

lab%.o: lab%.c 
    $(CC) -c $< -o [email protected] 

.PHONY:clean 
clean: 
    @echo cleaning things up, boss... 
    @rm -f *.o lab 

这将更好地处理相关性:如果修改labM.c但不labG.c,然后make,使会知道labM.o(和lab)必须重建,但labG.o不必是。

这是一个很大的进步,并且可以进一步改进(依赖性处理可以做得很漂亮,但是这是一个很好的开始。

+0

我已经有labM.o,为什么我需要从labM.c创建它? 而对于 'labM.o: GCC -c labM.c -o labM.o labG.o: GCC -c labG.c -o labG.o 实验室: GCC labM.o labG.o -o lab .PHONY:clean clean: rm -f * .o lab' 是在labMakefile里面吗? – JA3N 2012-03-18 23:26:31

+0

@ JA3N,如果你只想做'lab' *一次*,你不需要makefile,就像'gcc labM.o labG.o -o lab'一样。一个makefile可以自动执行这个过程,这样你就可以修改一个源代码,然后只是'make'。是的,所有这些都在labMakefile中。 – Beta 2012-03-19 00:07:25

+0

构建对象的模式规则是内置的,您不需要包含该模式。 – blueshift 2012-03-19 03:11:50

要运行生成文件,你必须调用 “制造”

如果你的makefile还没有一个标准的名称(生成文件或Makefile文件) ,您应该使用-f参数指定它:

make -f labMakefile 
+0

如果我在其中输入 'make:labMakefile:没有这样的文件或目录' 'make:***没有规则使目标labMakefile。 Stop.' – JA3N 2012-03-18 21:50:26

+0

谁,你没有告诉我足够!你的makefile的名字是什么?在哪个目录中。不要忘记cd到正确的目录,然后调用make make“make -f replaceThisStringWithTheNameOfYourMakefile” – laerne 2012-03-18 22:04:03

+0

我的makefile的名称_should_是labMakefile,我想我没有做到这一点..这是我遇到的问题之一。对不起,如果我没有提到 – JA3N 2012-03-18 22:06:26