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
makefile是由Make运行的脚本。它只是一个用严格的语法编写的文本文件,它与源代码(尽管它被解释,不编译)一样需要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
是这个样子(注意前导空格选项卡):
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 lab
或make clean
或make 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
不必是。
这是一个很大的进步,并且可以进一步改进(依赖性处理可以做得很漂亮,但是这是一个很好的开始。
我已经有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
@ JA3N,如果你只想做'lab' *一次*,你不需要makefile,就像'gcc labM.o labG.o -o lab'一样。一个makefile可以自动执行这个过程,这样你就可以修改一个源代码,然后只是'make'。是的,所有这些都在labMakefile中。 – Beta 2012-03-19 00:07:25
构建对象的模式规则是内置的,您不需要包含该模式。 – blueshift 2012-03-19 03:11:50
要运行生成文件,你必须调用 “制造”
如果你的makefile还没有一个标准的名称(生成文件或Makefile文件) ,您应该使用-f参数指定它:
make -f labMakefile
如果我在其中输入 'make:labMakefile:没有这样的文件或目录' 'make:***没有规则使目标labMakefile。 Stop.' – JA3N 2012-03-18 21:50:26
谁,你没有告诉我足够!你的makefile的名字是什么?在哪个目录中。不要忘记cd到正确的目录,然后调用make make“make -f replaceThisStringWithTheNameOfYourMakefile” – laerne 2012-03-18 22:04:03
我的makefile的名称_should_是labMakefile,我想我没有做到这一点..这是我遇到的问题之一。对不起,如果我没有提到 – JA3N 2012-03-18 22:06:26
我怀疑它给你的错误信息,因为它是一个不同的大写字母。当然,除非...... – 2012-03-18 21:47:01
我认为'make -f labMakeFile lab'' – JA3N 2012-03-18 21:48:17
那么,你的makefile被称为'labMakefile'(显然),而不是'labMakeFile',所以有一个问题。第二个问题是你要求它建立目标'lab',但你的makefile没有任何叫做'lab'的目标。 – 2012-03-18 21:52:01