我在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
makefile是由Make运行的脚本.它只是一个用严格语法编写的文本文件,它需要像源代码一样(虽然它被解释,但没有编译).您可以使用任何您喜欢的文本编辑器来创建它.
您正在使用C(根据文件名的后缀判断).所以labM.o从labM.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 lab或make clean或make 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不必.
这需要很多,并且可以进一步改进(依赖处理可以非常流畅),但这是一个良好的开端.