MakeFile 的写法(转载)

MakeFile 的写法(z)  


makefile是一种描述依赖关系的文件, 它主要描述的是整个工程编译规则, 同时也给工程的维护提供很大的方便. 这在大型工程中非常实用. 在写好makefile之后, 只需要在命令行输入make命令, 工程就按照既定的makefile规则进行"自动化编译".

1. 编译(compile)和链接(link):

我们通常所说的编译一般来说指的是编译和链接这两个过程的总称.

不管是什么类型的源文件(.c .cpp .pas .i...), 都需要先通过编译器中的编译单元生成目标文件(Object File), 它在Windows下是.obj文件, 在Linux下是.o文件, 这个过程叫作编译.

然后编译器的链接单元把这些生成的目标文件合成为可执行文件, 这时链接单元只使用这些目标文件, 并不关心源代码, 这个过程叫作链接.

在很多时候, 由于源文件的数目过于庞大, 编译后生成的目标文件数目也就很多, 在链接过程中由于需要指出所有目标文件, 这就显得很不方便, 于是我们可以把多个目标文件打个包.

在Windows下管这种文件叫库文件(Library File), 扩展名为.lib;

在Linux下这种文件叫Archive File, 扩展名为.a.

可见.lib和.a都是编译的产物而非链接的产物.

2. makefile:

我们首先看一个简单的makefile:

CC = g++

OBJS = main.o base.o derive.o

EXEC = test

$(EXEC): $(OBJS)

        $(CC) -o $@ $^

main.o: main.cpp base.h derive.h

        $(CC) -c $<

base.o: base.cpp base.h

        $(CC) -c $<

derive.o: derive.cpp derive.h base.h

        $(CC) -c $<

clean:

        rm -rf $(EXEC) *.o

这里需要说明几个概念: 变量, 目标, 依赖.

变量: CC = g++, 这个CC就是一个在makefile里定义的变量, 在定义后可以使用, 使用时是$(CC).

目标和依赖: main.o: main.cpp base.h derive.h, 这个":"(冒号)分开的两边中, 左边就是目标, 右边就是该目标的依赖, 而下一行的命令就是对应于这一对目标/依赖关系的. 当需要实现这个目标时, 如果依赖中有更新, 就需要执行下面的命令.

比如, 当我们执行:

MakeFile 的写法(z) - butterfly - 天空下的向日葵make clean

就会执行对应目标"clean"下的命令, 因为clean是没有依赖的, 所以这个命令总被执行.

3. 隐含变量:

在这个makefile文件中, 可以看到诸如$^ $< $@这样的东西, 这被我称为makefile的隐含变量.

$^: 指的是当前依赖中的所有对象.

$<: 指的是当前依赖中的第一个对象.

$@: 指的是当前目标.

 

规则+工程:一种比较灵巧通用的Makefile写法

整理项目的makefile,顺便对其写法简单归纳整理如下。这种写法乍一看让人比较晕,定义的规则和宏比较多,貌似有点累赘。

但是如果项目比较大的话,这种写法有利于统一项目生成规则(相同类型的文件都用相同的处理规则),减少makefile编写的工作量(不需要自己编写规则,只需要提供文件列表),同时也减少了出错的概率。比较规范和灵活通用,值得借鉴。

这种写法把Makefile分为通用规则定义文件和工程定义文件两部分

------------------------------------------------------------

[com.mk通用规则定义文件]

CC = gcc

 #.SUFFIXES定义符合编译规则的扩展文件类型,.c/.h/.cxx已经被默认支持。

#示例增加了.d文件(Pro*C文件.pc也可以如此处理)

.SUFFIXES:   .d 

#定义相同类型文件对应的统一规则

.c.o:                                          #定义如何从.c生成.o的规则

       @echo '--'$*.c                 #写这一行,可以打印出被处理的文件

       $(CC) -o $*.o -c $*.c      # 生成.o的语句

.d.c:                                         #定义如何从.d文件生成.c文件的规则

       @echo '--'$*.d                #写这一行,可以打印出被处理的文件

       cp $*.d $*.c                    #生成.c文件的语句

.d.o:                                        #定义如何从.d文件生成.o文件的规则

       @echo '--'$*.d               #写这一行,可以打印出被处理的文件

       cp $*.d $*.c                   #因为本例中是要调用c编译器,所以先生成.c文件

       $(CC)  -o $*.o -c $*.c   #再从.c文件生成.o

#定义编译入口

all:build

# 下面这句定义了需要从哪些源文件(CFILE/DFILE所定义的列表)

#和什么规则(.c=.o即从.c生成.o; .d=.o表示从.d生成.o)生成目标文件

ALLOBJS =$(CFILE:.c=.o) $(DFILE:.d=.o)

#编译命令,表示先编译目标对象,再输出可执行文件

$(EXE):$(ALLOBJS)

 $(CC) -o $@ $(ALLOBJS)

#清除语句,同样是利用了规则定义,

clean:

 rm -f $(DFILE:.d=.o) $(DFILE:.d=.c)

 rm  -f $(CFILE:.c=.o)

 rm -f  $(EXE)

------------------------------------------------------------

[makefile代码目录下的工程定义文件]

#定义输出目标名称

EXE=testexe

#以下只需要提供文件列表和定义编译目标

CFILE=m.c                          #定义C源文件列表,可以有多个

DFILE=testd.d teste.d      #定义D源文件列表,可以有多个

#给编译入口赋值

build: $(EXE)

COMMPATH=./  #指定模版所在路经

include $(COMMPATH)/com.mk                 #包含通用模版文件,make会调用通用模版里的规则,进行编译

标准的makefile写法 (初级) (C/C++)

http://www.cnblogs.com/oomusou/archive/2006/11/29/575838.html

一个很典型的Linux C/C++的makefile写法,其它的应用可根据此template修改。
(注意每一行的前面若有空格,是tab,不是space)

1MakeFile 的写法(z) - butterfly - 天空下的向日葵#Source file

 2MakeFile 的写法(z) - butterfly - 天空下的向日葵

 3MakeFile 的写法(z) - butterfly - 天空下的向日葵SRC = ThreadQueue.cpp

 4MakeFile 的写法(z) - butterfly - 天空下的向日葵#Object file

 5MakeFile 的写法(z) - butterfly - 天空下的向日葵OBJ = $(SRC:.cpp=.o)

 6MakeFile 的写法(z) - butterfly - 天空下的向日葵

 7MakeFile 的写法(z) - butterfly - 天空下的向日葵#Output execution file

 8MakeFile 的写法(z) - butterfly - 天空下的向日葵PROGRAM = ThreadQueue

 9MakeFile 的写法(z) - butterfly - 天空下的向日葵

10MakeFile 的写法(z) - butterfly - 天空下的向日葵#Compiler

11MakeFile 的写法(z) - butterfly - 天空下的向日葵CC = g++

12MakeFile 的写法(z) - butterfly - 天空下的向日葵

13MakeFile 的写法(z) - butterfly - 天空下的向日葵#Include

14MakeFile 的写法(z) - butterfly - 天空下的向日葵

15MakeFile 的写法(z) - butterfly - 天空下的向日葵INCLUDE = -I/usr/include/ncurses -I/usr/include/

16MakeFile 的写法(z) - butterfly - 天空下的向日葵#Linker Parameter

17MakeFile 的写法(z) - butterfly - 天空下的向日葵LINKPARAM = -lpthread -lncurses

18MakeFile 的写法(z) - butterfly - 天空下的向日葵#Options for development

19MakeFile 的写法(z) - butterfly - 天空下的向日葵

20MakeFile 的写法(z) - butterfly - 天空下的向日葵#CFLAGS = -ansi -g -Wall

21MakeFile 的写法(z) - butterfly - 天空下的向日葵#Options for release

22MakeFile 的写法(z) - butterfly - 天空下的向日葵

23MakeFile 的写法(z) - butterfly - 天空下的向日葵CFLAGS = -ansi -O -Wall

24MakeFile 的写法(z) - butterfly - 天空下的向日葵

25MakeFile 的写法(z) - butterfly - 天空下的向日葵

26MakeFile 的写法(z) - butterfly - 天空下的向日葵

27MakeFile 的写法(z) - butterfly - 天空下的向日葵all: $(PROGRAM)

28MakeFile 的写法(z) - butterfly - 天空下的向日葵

29MakeFile 的写法(z) - butterfly - 天空下的向日葵

30MakeFile 的写法(z) - butterfly - 天空下的向日葵

31MakeFile 的写法(z) - butterfly - 天空下的向日葵$(PROGRAM): $(OBJ)

32MakeFile 的写法(z) - butterfly - 天空下的向日葵

33MakeFile 的写法(z) - butterfly - 天空下的向日葵    $(CC) -o $(PROGRAM) $(LINKPARAM) $(OBJ) 

34MakeFile 的写法(z) - butterfly - 天空下的向日葵

35MakeFile 的写法(z) - butterfly - 天空下的向日葵.SUFFIXES : .cpp

36MakeFile 的写法(z) - butterfly - 天空下的向日葵 

37MakeFile 的写法(z) - butterfly - 天空下的向日葵

38MakeFile 的写法(z) - butterfly - 天空下的向日葵

39MakeFile 的写法(z) - butterfly - 天空下的向日葵.cpp.o:

40MakeFile 的写法(z) - butterfly - 天空下的向日葵

41MakeFile 的写法(z) - butterfly - 天空下的向日葵    $(CC) $(INCLUDE) $(CFLAGS) -c $<

42MakeFile 的写法(z) - butterfly - 天空下的向日葵

43MakeFile 的写法(z) - butterfly - 天空下的向日葵

44MakeFile 的写法(z) - butterfly - 天空下的向日葵

45MakeFile 的写法(z) - butterfly - 天空下的向日葵clean:

46MakeFile 的写法(z) - butterfly - 天空下的向日葵

47MakeFile 的写法(z) - butterfly - 天空下的向日葵    -rm *.o

48 MakeFile 的写法(z) - butterfly - 天空下的向日葵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值