make笔记

 

Makefile基本格式如下:

target ... : prerequisites ...
    command
    ...
    ...
其中,

target        - 目标文件, 可以是 Object File, 也可以是可执行文件
prerequisites - 生成 target 所需要的文件或者目标
command       - make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头

 

Makefile 中书写shell命令时可以加2种前缀 @ 和 -, 或者不用前缀.

3种格式的shell命令区别如下:

不用前缀 :: 输出执行的命令以及命令执行的结果, 出错的话停止执行
前缀 @   :: 只输出命令执行的结果, 出错的话停止执行
前缀 -   :: 命令执行有错的话, 忽略错误, 继续执行

 

Makefile的退出码有以下3种:

0 :: 表示成功执行
1 :: 表示make命令出现了错误
2 :: 使用了 "-q" 选项, 并且make使得一些目标不需要更新

 

编译C时,<n>.o 的目标会自动推导为 <n>.c

# Makefile 中
main : main.o
    gcc -o main main.o

#会自动变为:
main : main.o
    gcc -o main main.o

main.o: main.c    <-- main.o 这个目标是隐含生成的
    gcc -c main.c

 

Makefile 中很多时候通过自动变量来简化书写, 各个自动变量的含义如下:

自动变量

含义

$@    目标集合
$%    当目标是函数库文件时, 表示其中的目标文件名
$<    第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标
$?    比目标新的依赖目标的集合
$^    所有依赖目标的集合, 会去除重复的依赖目标
$+    所有依赖目标的集合, 不会去除重复的依赖目标
$*    这个是GNU make特有的, 其它的make不一定支持

 

变量名

含义

RM    rm -f
AR    ar
CC    cc
CXX    g++

ARFLAGS    AR命令的参数
CFLAGS    C语言编译器的参数
CXXFLAGS    C++语言编译器的参数

 

伪目标

含义

all    所有目标的目标,其功能一般是编译所有的目标
clean    删除所有被make创建的文件
install    安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中去
print    列出改变过的源文件
tar    把源程序打包备份. 也就是一个tar文件
dist    创建一个压缩文件, 一般是把tar文件压成Z文件. 或是gz文件
TAGS    更新所有的目标, 以备完整地重编译使用
check 或 test    一般用来测试makefile的流程

 

posted @ 2017-10-17 11:04  狂神314  阅读(220)  评论(0编辑  收藏  举报