Makefile(未完)

5 篇文章 0 订阅
2 篇文章 0 订阅
  • 前言

在一个大型程序中,如果只是修改了其中第一个源文件,那么重新编译所有的源文件就太不值当了!使用make工具可以只重新编译修改过的源文件。

但是,要想make这把大杀器发挥出它的威力,Makefile至关重要。make命令和Makefile文件的结合提供了一个在项目管理领域的十分强大的工具。不仅常用于控制源代码的编译,还用于使用手册的编写以及将程序安装到目标目录

老汉是初学,欢迎指点交流切磋!(一下内容部分选自《Beginning Linux Programing》)

  • make命令的基本参数

make有三个常用选项

-k:发现错误后,继续

-n:输出将要执行的操作步骤,不真正执行

-f <filename>:指定makefile文件。如果直接make,将首先查找当前目录下名为makefile文件。若没有那接着查找Makefile文件。

先来看个实例:

myapp: main.o boy.o girl.o
	gcc -o myapp main.o boy.o girl.o
main.o: main.c lib.h
	gcc -c main.c
boy.o: boy.c
	gcc -c boy.c
girl.o: girl.c
	gcc -c girl.c

*.c 和*.h 文件内容,请参考另一片博客老汉带你linux编程(1)--静态库

第一行中myapp就是我们要创建的目标,它依赖于main.o, boy.o, girl.o。(冒号“:”紧跟myapp)

第二行表示创建目标myapp的规则,告诉编译器根据三个对象main.o, boy.o, girl.o来创建目标myapp

第三行表示目标main.o,依赖于main.c和lib.h

第四行表示目标main.o的创建规则。此后,以此类推

  • makefile文件中的宏以及多个目标

我们通过语句MACRONAME = value在makefile文件中定义宏,引用宏的方法是使用$(MACRONAME) or ${MACRONAME)。如果我们想把一个宏的值设置为空,可以令等号后内容为空。

通常,我们需要制作多个目标,例如clean,install。下面我们在makefile中加入目标clean和install规则,这样可以通过make clean来删除不需要的目标文件。通过make install将编译成功的应用程序安装到指定目录下

#带宏定义,多个目标

all: myapp
# Which complier
CC = gcc

#Where to install
INSTDIR=/home/admin-vaio/tmp

# Where are include files kept
INCLUDE = .

#Options for development 
#CFLAGS 编译器选项 
CFLAGS = -g -Wall -ansi

#-w:不生成任何警告信息  
#-Wall:输出所有的警告信息  
#-O:在编译时进行优化(注:O为大写字母)  
#-O0:不进行优化处理  
#-O或-O1:优化生成代码,缺省值  
#-O2:进一步优化  
#-O3:比-O2更进一步优化,包括inline函数  
#-g:表示编译debug版本,生成调试信息(注:使用GNU的gdb必须加入这个选项)  
#-ansi:只支持ANSI标准的C语法,这一选项将禁止GNU C的某些特色,例如asm或typeof关键词 

#Options for release
#CFLAGS -O -Wall -ansi

myapp: main.o boy.o girl.o
	$(CC) -o myapp main.o boy.o girl.o
main.o: main.c lib.h
	$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
boy.o: boy.c
	$(CC) -I$(INCLUDE) $(CFLAGS) -c boy.c
girl.o: girl.c
	$(CC) -I$(INCLUDE) $(CFLAGS) -c girl.c

# 目标clean 用rm命令来删除目标文件,rm命令以减号'-'开头,其含义
# 是让make命令忽略rm命令的执行结果。# clean没有任何依赖关系,
# 所以执行make时,加上clean参数,该目标才会被执行
clean:
	-rm main.o boy.o girl.o

#目标install依赖于myapp,所以make命令知道它必须首先创建myapp,
#然后才能执行创建该目标所需的其他命令
#制作install目标的规则由几个shell脚本命令组成,所以make命令在
#执行规则时会调用一个shell
install: myapp
	@if [ -d $(INSTDIR) ]; \
		then \
		cp myapp $(INSTDIR);\
		chmod a+x $(INSTDIR)/myapp;\
		echo "Installed in $(INSTDIR)";\
	else \
		echo "Sorry, $(INSTDIR) does not exist";\
	fi

#注意:[ 与 -d之间有空格


管理函数库

makefile和子目录


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值