makefile小教程与示例

学习过程中的一点点笔记

一、简介

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,数字越大优化程度越高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值