Linux Notes 01: makefile 写法

本文介绍了Makefile的基础使用方法,包括如何定义依赖关系、创建规则、使用宏及设置多目标等。通过实例展示了如何构建项目,并提供了清洁(clean)和安装(install)等额外目标的设置方法。

1、写依赖关系

ExpandedBlockStart.gifmakefile 依赖关系
myapp: main.o 2.o 3.o
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h

      基本是倒序的顺序,定义最终输出的是myapp,然后写myapp的依赖关系,即它是依赖那些文件生成的,然后对于myapp依赖的这些文件,挨个照例写出他们的依赖。

      写法上注意,“:”紧贴在输出对象后面,冒号后面是一个空格,之后接着依赖的各项,用空格隔开。

      有个简单的办法,终端输入gcc -MM main.c 2.c 3.c,直接就得到了依赖关系,把结果拷进makefile里面就行了。

2、明确创建规则

ExpandedBlockStart.gifmakefile 创建规则
myapp: main.o 2.c 3.c
    gcc -o myapp main.o 2.o 3.o
main.o: main.c a.h
    gcc -c main.c
2.o: 2.c a.h b.h
    gcc -c 2.c
3.o: 3.c b.h c.h
    gcc -c 3.c

     简单地说,就是在前面写好的规则下面,加上一句,说明这个依赖关系是怎么实现的,如“gcc -o myapp main.o 2.o 3.o”,用gcc,将三个输出文件合并,得到最后的结果。

     这些创建规则,会在make的时候显示出来。

3、宏

ExpandedBlockStart.gifmakefile 宏
CC=gcc
myapp: main.o 2.c 3.c
    $(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
    $(CC) -c main.c
2.o: 2.c a.h b.h
    $(CC) -c 2.c
3.o: 3.c b.h c.h
    $(CC) -c 3.c
   

      makefile文件中的宏常用语设置编译器选项。我是新手,多的功能没见过,简单地说,就是把命令中本来写死的东西,用宏来包装,需要变更的时候,不用再makefile里面改,直接在运行make的时候改就可以了。如上面的makefile在运行的时候,可以这样“make CC=c89”,这样就改变了编译工具。

4、多目标

      在makefile里面,不知可以写编译文件的东西,还有错其他的事情。比如make clean,make install。如下面例子所示。

ExpandedBlockStart.gifmakefile 多目标
all: myapp
CC=gcc
INSTDIR=/usr/local/bin
INCLUDE=.
CFLAGS=-g-Wall-ansi
myapp: main.o a.o
    $(CC) -o myapp main.o a.o
main.o: main.c main.h a.h
    $(CC) -I$(INCLUDE)$(CFLAGS) -c main.c
a.o: a.c a.h
    $(CC) -I$(INCLUDE)$(CFLAGS) -c a.c 
clean:
    -rm main.o a.o
install: myapp
    if[ -d $(INSTDIR)];\
        then \
            cp myapp $(INSTDIR);\
            chmod a+X $(INSTDIR)/myapp;\
            chmod og-w $(INSTDIR)/myapp;\
            echo "Installed in $(INSTDIR)";\
    else
        echo "Sorry,$(INSTDIR) does not exit";\
    fi

       我比较无聊,又试了下别的,比如:

ExpandedBlockStart.gifmakefile 多目标2
all: myapp
CC=gcc
INSTDIR=/usr/local/bin
INCLUDE=.
CFLAGS=-g-Wall-ansi
myapp: main.o a.o
    $(CC) -o myapp main.o a.o
main.o: main.c main.h a.h
    $(CC) -I$(INCLUDE)$(CFLAGS) -c main.c
a.o: a.c a.h
    $(CC) -I$(INCLUDE)$(CFLAGS) -c a.c 
clean:
    -rm main.o a.o
out:
    echo test

       在终端里面输入“make out”,输出了“test”。所以,我理解,makefile里面的clean、install,以及out,应该是类似于标签的一个东西,make+标签选择执行makefile中的一部分代码。

       初步先这样,凑活着能编译程序了,其他的不断积累。

转载于:https://www.cnblogs.com/YFYkuner/archive/2011/10/20/2219425.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值