您的位置:首页 > 运维架构 > Linux

Linux makefile基础知识

2016-12-17 15:31 405 查看

用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*:不包括后缀名的当前依赖文件的名字

在makefile文件中,下面两个字符也经常会遇见:

@:告诉make在执行某条命令前不要将该命令显示在标准输出上。

-:告诉make命令忽略所有错误。

内置规则

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

make main1.c

也可以指明是通过gcc

make CC=gcc CFLGAS=”-Wall -g” main1.c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: