学习过程中的一点点笔记
一、简介
make是一个工具程序,读取"makefile"这个文件,来自动化建构软件。
在许多现代软件的开发中,集成开发环境已经取代make,但是在unix中,make仍然十分常用。
makefile根据目标、规则、文件的修改时间判断哪些需要重新编译,可以省去重复编译的时间。
makefile最重要的就是依赖关系。
二、makefile主要内容
1.规则
规则由目标、依赖和命令组成。
- 目标(Target):目标文件或者可执行文件,还可以是伪目标(下文阐述)
- 依赖(Dependencies, Prerequisites):产生目标文件所需要的文件
- 命令:所执行的shell命令
格式如下:
# 用“井”号表明注释。
target(要生成的文件): dependencies(被依赖的文件)
# 命令前面用的是“tab”而非空格。误用空格是初学者容易犯的错误!
Tab 命令1
Tab 命令2
Tab 命令3
.
.
.
Tab 命令n
# 可以使用“\”表示续行。注意,“\”之后不能有空格!
2.伪目标.PHONY
并不是一个目标文件或者可执行文件,例如all, install, clean, distclean, TAGS, info和check。
make clean并不会生成一个叫做clean的文件
.PHONY: clean
clean:
rm *.o
3.定义变量
声明一个变量要使用=或者:=,使用“$(变量名)”来使用变量,还可以用“+=”追加变量的内容。
objects = program.o foo.o utils.o
program : $(objects)
cc -o program $(objects)
$(objects) : defs.h
一些常用的默认变量:
- $@:完整目标文件名称
- $<:第一个依赖文件名称
- $*:不包含扩展名的目标文件名称
- $?:被修改过的所有依赖文件
- $^:所有的依赖文件,不包含重复的依赖文件
三、示例(编译通过)
hello.cpp:
#include <iostream>
using namespace std;
int main()
{
int a = 1;
cout<<"a is "<<a<<endl;
return 0;
}
makefile:
all:hello.cpp
g++ -o hello.out hello.cpp
clean:
rm hello.out
四、gcc参数
- -c:编译但不进行链接
- -ansi:根据ansi标准,以增加可移植性
- -I:追加include文件的搜寻路径
- -Wall:编译时显示所有的警告信息
- -g:加入调试信息(使用gdb调试时要加)
- -O:表示优化程度,默认是 -O1,可以指定 -O2 或 -O3,数字越大优化程度越高。