LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 985|回复: 3

很菜的人翻译了一篇关于make && makefiles的文章,请指正

[复制链接]
发表于 2004-1-21 13:10:37 | 显示全部楼层 |阅读模式
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++.
发表于 2004-1-21 14:40:05 | 显示全部楼层
此文适合发到程序设计版
发表于 2004-1-28 19:02:42 | 显示全部楼层
呵呵,弟兄们看看吧,能长见识。
发表于 2004-1-28 20:14:03 | 显示全部楼层

谢谢!

rt
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表