Linux makefile基础知识

用Make进行宏编译

为什么用makefile?

当一个程序分为多个部分的时候,当其中的一个文件修改后需要重新编译所有的文件,过程非常复杂。
在makefile中,存在系统默认的自动化变量
: @:代表目标
$<:代表第一个依赖文件

Demo如下:

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
#   gcc $^ -o $@ ${LIBS}
    gcc -o $@ $^ ${LIBS}
clean: 
    rm -f ${OBJS}

Linux makefile

make就像Shell脚本一样,其中也可以执行操作系统的命令。整个软件工程的编译、链接只需要一个make指令就可以完成。其中包括:哪些源文件需要编译以及如何编译;需要创建哪些库文件以及如何创建这些库文件、如何产生我们想要的可执行文件。

规则:用于说明如何生成一个或多个目标文件,规则格式如下:

targets:prerequisites
command
目标 依赖 命令
main.o(目标):main.c(依赖)
gcc -c main.c(命令)

makefile中把那些没有任何依赖只执行动作的目标成为“伪目标”(phony targets)

http://blog.csdn.net/ruglcc/article/details/7814546/

可以参考这个PPT:
http://wenku.baidu.com/link?url=zRKmb2VRhOV6d4DmaAB2zc4-dRwjcbCQlPb2i-ilNiadCI0UQ8UiJZcHoWmKZj2RSL8mwarZprkNdCa8tNDOAOI4aDG500FvuT7vaLyzj0q

可以参考鸟哥的Linux私房菜 第668页

makefile的基本语法与变量

makefile规则如下:

目标(target):目标文件1 目标文件2
gcc -o 欲新建的可执行文件 目标文件1 目标文件2

Demo1

makefile文件里面有两个目标:

main: main.o haha.o sin_value.o cos_value.o
    gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean: 
    rm -f main main.o haha.o sin_value.o cos_value.o

只编译:

make main

清除信息:

make clean

先清除信息再编译:

make clean main

Demo2

运用变量来简化makefile:

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o

main: ${OBJS}
    gcc -o main ${OBJS} ${LIBS}
clean: 
    rm -f main ${OBJS}

注:
1.变量与变量内容以“=”隔开,同时两边具有空格。
2.变量左边不可以有,例如上面范例的第一行LIBS左边不可以有
3.变量习惯上用大写。

Demo3

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall    #这个变量加入一些标识信息
main: ${OBJS}
    gcc -o main ${OBJS} ${LIBS}
clean: 
    rm -f main ${OBJS}

Demo4

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall    #这个变量加入一些标识信息
main: ${OBJS}
    gcc -o $@ ${OBJS} ${LIBS}   #$@ 就是main
clean: 
    rm -f main ${OBJS}

Demo5

makefile当中ifeq和else ifeq的使用

#VAR1 = A
VAR1 = B
main: main.o
    gcc -o main main.o

ifeq ($(VAR1),A)
    ./toucha.sh
else ifeq ($(VAR1),B)
    ./touchb.sh
endif

clean:
    rm -f main main.o a.txt b.txt

Demo5

当同时想编译两个输出的可执行文件时,要加入all,Demo如下;

all: main1 main2
main1: main1.o
    gcc -o main1 main1.o 
main2: main2.o
    gcc -o main2 main2.o 

clean:
    rm -f main1 main1.o main2 main2.o

makefile里面有什么?
Makefile里主要包含了五个东西:显示规则、隐晦规则、变量定义、文件指示和注释。
显示规则:显示规则说明了如何生成一个或多个的目标文件。
隐晦规则:由我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗略书写makefile。
变量定义:
文件指示:
注释:

文件名

make -f 文件名

变量

在makefile中,存在系统默认的自动化变量。

@:当前目标的名字
<:c <script type="math/tex" id="MathJax-Element-9">< : 当前依赖文件的名字c </script>*:不包括后缀名的当前依赖文件的名字

在makefile文件中,下面两个字符也经常会遇见:
@:告诉make在执行某条命令前不要将该命令显示在标准输出上。
-:告诉make命令忽略所有错误。

内置规则

make命令本身带有大量的内置规则,可以极大地简化makefile文件的内容。

make main1.c

也可以指明是通过gcc

make CC=gcc CFLGAS=”-Wall -g” main1.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值