|
make
Make(在命令行中他是make),是一个用于构造工程(bulid project)的工具。它在apollo上
可以运行,后来在win32特性的cygnus(译:天鹅座)也可以运行。基于一种为编译程序建立
>
依靠性的(dependancies)的初衷,只需要在make后键入一个目标名字,就可以为你建立你
所
要的二进制包,而免去了你费神去记住如何编译程序的苦恼。
Makefile
默认情况下,Make将会读在当前目录下的一个叫Makefile。每一个在makefile里面的目标
(target),都会有一个名字,依靠性,如何编译的说明。依靠性可能会是另外一个目标,
这样
可以避免多余的工作。
注意:一个目标的说明应该以一个tab键作为开头
下面是一个实例:
# 在"#"后的东西都是注释,就像C++里的 "//"一样
prog1: prog1.cpp
g++ -Wall prog1.cpp -o prog1
clean:
rm -f prog1
#--------------------------------------------------------
这里还有一个当有两个.o文件时的例子
prog2: main.o stack.o
g++ -Wall main.o stack.o -o prog2
#------------------------------------------------------------
#下面的main和stack的代码以及stack.h文件就成了编译的依靠文件
#这里的-c参数表示"只编译",它创建.o文件
main.o: main.cpp stack.h
g++ -Wall -c main.cpp
stack.o: stack.cpp stack.h
g++ -Wall -c stack.cpp
clean:
rm -f prog2 *.o
#--------------------------------------------------------------
下面的例子将建立一个多模块的二进制包,它不对未改变的代码进行重复
编译。并且编译每一个段到一个目标文件里,然后把他们连接起来。它很像前面的例子,
除
了它使用了变量定义,和一个默认的叫做"help"的目标之外
# CC, CFLAGS, CXXFLAGS, 和 LDFLAGS 是变量
#使用他们可以很轻易的改变编译器和变量参数
#你可以任意使用名字,除了一些有特定含义的名字,像"CC"CC=g++ # 编译器
CXXFLAGS=-Wall # c++编译标志
LDFLAGS=-Wall # 连接器(linker)标志
help:
@echo "cool_prog: builds the program"
@echo "clean: cleans up the directory"
# 这个@符号禁止@后的命令输出到终端
#---------------------------------------------
String.o: String.cpp String.h
$(CC) $(CXXFLAGS) -c String.cpp
Queue.o: Queue.cpp Queue.h
$(CC) $(CXXFLAGS) -c Queue.cpp
cool_prog.o: cool_prog.cpp cool_prog.h
$(CC) $(CXXFLAGS) -c cool_prog.cpp
cool_prog: String.o Queue.o cool_prog.o
$(CC) $(LDFLAGS) String.o Queue.o cool_prog.o -o cool_prog
clean:
rm -f *.o cool_prog
#-----------------------------------------------------------
这里还有一些在"make"中预定义的变量,前面的"Makefile"使用了他们,现在我们在注释
行
里给出他们的含义。一些在前面的makefile使用的预定以的变量,他们没有生成help目标
CC=g++
CXXFLAGS=-g -Wall
LDFLAGS=-g -Wall
# $< first depandancy
# $^ all depandancies
# $@ target
cool_prog: String.o Queue.o cool_prog.o
$(CC) $(LDFLAGS) $^ -o $@
String.o: String.cpp String.h
$(CC) $(CXXFLAGS) -c $<
Queue.o: Queue.cpp Queue.h
$(CC) $(CXXFLAGS) -c $<
cool_prog.o: cool_prog.cpp cool_prog.h
$(CC) $(CXXFLAGS) -c $<
clean:
rm -f *.o cool_prog
如果你不得不在一个"makefile"里建立多个程序,你只需要用一个虚拟目标(dummy targe
t)去列出你所要建立的目标。
all: prog1 prog2
prog1: foo.o prog1.o
g++ -Wall foo.o prog1.o -o prog1
prog2: foo.o prog2.o
g++ -Wall foo.o prog2.o -o prog2
prog1.o: prog1.cpp foo.h
g++ -Wall -c prog1.cpp
prog2.o: prog2.cpp foo.h
g++ -Wall -c prog2.cpp
foo.o: foo.cpp foo.h
g++ -Wall -c foo.cpp
clean:
-rm -f *.o prog1 prog2
(这里的翻译拿不准,附上原文)
用这种方式,变量中的信息会跟多,Makefile会变得非常小。
首先它不能建立两个一样的程序按照这种makefile的方法
More info on variables, built in rules, and minimal Makefiles :
I can t build the same two programs as above with this Makefile
#------------------------------------------------------
CC=g++
LDFLAGS=-Wall
CXXFLAGS=-Wall
TARGETS=prog1 prog2
all: ${TARGETS}
prog1: prog1.o foo.o
prog2: prog2.o foo.o
prog1.o: prog1.cpp foo.h
prog2.o: prog2.cpp foo.h
foo.o: foo.cpp foo.h
clean:
-rm -f *.o ${TARGETS}
只要你遵循一些命名约定,这种可执行性是必须具有跟前面的目标文件一样的base name,
而
且这个目标文件必须具有跟前面的源文件(cpp文件)一样的base name,这个base name是一
>
个没有扩展名的文件的名字(例如,除掉.o;.cpp的名字)。
CXXFLAGS是把"-c"的标志传递给编译你cpp文件的编译器(编译c语言时用CFLAGS)。CC 和
LDFLAGS必须在连接c++代码时被定义,因为你的编译器默认使用gcc去连接这些目标文件。
这>
一切都是因为.o的扩展名不能清晰的告诉编译器我们的源代码是c还是c++. |
|