Makefile初步学习

今天用notepad++写代码,多文件的,包括go.cpp,gofsize.cpp,gofsize.h,编译时总是报如下错误:

G:\go/go.cpp:22: undefined reference to `gofilesize(std::basic_ifstream >&)'
collect2: ld returned 1 exit status

反复查找也找不到原因,直接到MinGW Shell里敲代码

g++ -Wall go.cpp gofsize.cpp -o go

直接编译通过了,这才发现,自己在notepad++里面设置的快捷编译只是编译go.cpp一个文件:

NPP_EXEC: "GCC_Compile"
NPP_SAVE: G:\go\go.cpp
G++ go.cpp -o go.exe -g
Process started >>>

难怪,找到原因之后,自然而然想到了该用Makefile了,每次敲那么多命令会很烦的。
找了些makefile的资料:

target ... : prerequisites ... 
	command1
	command2
	...

写如下内容到makefile:

go:go.o gofsize.o
	g++ -Wall go.o gofsize.o -o go
go.o:go.cpp gofsize.h
	g++ -Wall -c go.cpp
gofsize.o:gofsize.cpp gofsize.h
	g++ -Wall -c gofsize.cpp

其中对于第一行,go是这条规则的目标(Target),go.o、gofsize.o是这条规则的条件(Prerequisite)。目标和条件之间的关系是:欲更新目标,必须首先更新它的所有条件;所有条件中只要有一个条件被更新了,目标也必须随之被更新。所谓“更新”就是执行一遍规则中的命令列表,命令列表中的每条命令必须以一个Tab开头,注意不能是空格,Makefile的格式不像C语言的缩进那么随意,对于Makefile中的每个以Tab开头的命令,make会创建一个Shell进程去执行它。其他行与第一行类似。(参考宋劲杉《Linux C编程一站式学习》http://www.tecbbs.com/linuxc/ch22s01.html
这样之后在notepad++的控制台敲make就可以正常编译了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注