makefile基础和工作常用点补充

一、Makefile简介

Makefile是什么,能做什么用,为什么要用?

定义编译规则、自动化编译、提高效率 组织文件

Makefile由一组规则(Rule)组成,每条规则的格式是:

例如:

依赖关系如下图:

注意:

(1) 当我们为了执行命令而非创建目标文件时,就会使用伪目标比如 clean,伪目标总是被执行。".PHONY" 的作用是避免和当前

目录下的文件名冲突 (可能引发隐式规则)。

(2) 使用 "-" 前缀可以忽略命令错误,比如创建已有的路径; “@” 可以不显示命令本身

(3) Makefile 中 $、# 有特殊含义,可以进行转义 "\#"、"$$"。

(4) 可以使用 \ 换行 (注释行也可以使用),但其后不能有空格,新行同样必须以 Tab 开头和缩进。

(5) 在工作目录按 "GNUmakefile、makefile、Makefile (推荐)" 顺序查找执行,或 -f 指定。

(6) 如果不在 make 命令行显式指定目标规则名,则默认使用第一个有效规则。

(7) 每条命令都在一个独立 shell 环境中执行,如希望在同一 shell 执行,可以用 ";" 将命令写在一行,也可用\ 换行。

(8) 在makefile 常见的gcc/g++参数 -D 即条件编译; -static 使用静态库;注意 -L../lib -ldown  与 ../lib/libdown.so 等同

二、Makefile基本使用

make规则

没被编译过,则编译;只编译修改过的文件

头文件被改变,只编译包含该头文件的文件

常用选项 : -C dir    -f fileName  -n 显示待执行的命令,但不执行

Makefile组成

显式规则:生成、依赖文件,生成命令

隐含规则:make支持的自动推导功能, make –p 打印

变量定义:类C中宏作用(?=   :=  +=)。 引用方式 $(var) 或 ${var}。

  "="   递归展开变量,仅在目标展开时才会替换,也就是说它可以引用在后面定义的变量。  ":=" 直接展开变量,在定义时就直接展开,它无法后置引用。 "?=" 表示变量为空或未定义时才进行赋值操作。 "+=" 追加赋值,也是递归展开 执行shell命令赋值给变量 A = $(shell uname)

文件包含:include

 注释:    “#”

特殊变量:

三、Makefile 工作常用点补充

搜索路径

VPATH 变量  VPATH = ./src : ./lib

vpath关键字(vpath<pattern> <directories> vpath %.h ../inc)

vpath %.c ./src : ./lib # 定义匹配模式(%匹配任意个字符)和搜索路径。 vpath %.c  # 取消该模式 vpath  # 取消所有模式

VPATH 和 vpath 定义的搜索路径仅对 makefile 规则有效,对 gcc/g++ 命令行无效,比如不能用它定义命令行头文件搜索路径参数。

变量引用与替换

obj=$(dir:%.c=%.o) 可以将变量 dir 中所有以 c 结尾的单词替换成以 o 结尾

$(addprefix src/, foo  bar)  返回值为“src/foo src/bar” src=$(wildcard *.c ./sub/*.c) dir=$(notdir $(src)) obj=$(patsubst %.c,%.o,$(dir))

$(^D)

          $(^F)                     分别表示所有依赖文件的目录部分和文件部分。(无相同的)

条件判断

conditional-directive

text-if-true

else

text-if-false

endif

ifeq ($(CC),gcc) # 是否相等

ifdef CC   # 变量是否定义

自动推导依赖关系

gcc –M main.c 自动生成目标文件和源文件的依赖关系; -MM去除系统头文件的依赖关系

maze.d,其内容是 maze.o maze.d:maze.c maze.h main.h

参考:

《linux c 编程一站式学习》

《C 学习笔记》 by雨痕

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spark学习技巧

JAVA之ClassLoader

JAVA基础系列之ClassLoader 一,Java类的加载、链接与初始化 1,加载:查找并加载类的二进制数据 • 通过一个类的全限定名来获取定义此类的二进制...

2049
来自专栏大内老A

ASP.NET MVC以ValueProvider为核心的值提供系统: NameValueCollectionValueProvider

在进行Model绑定过程中,需要根据基于Action方法参数的绑定上下文从请求数据中提取相应的数据以提供相应的数据。具体来说,Model绑定的数据具有多个来源,...

1858
来自专栏Linyb极客之路

java反射的二三事

一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息,诸...

35311
来自专栏大内老A

通过实例模拟ASP.NET MVC的Model绑定机制:简单类型+复杂类型

总的来说,针对目标Action方法参数的Model绑定完全由组件ModelBinder来实现,在默认情况下使用的ModelBinder类型为DefaultMod...

2218
来自专栏java、Spring、技术分享

fastjson详解

  fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

951
来自专栏Script Boy (CN-SIMO)

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

场景:eclipse中编写java中用到数组 问题:       程序不报错但是运行过程中 终止,显示字样 “ Exception in thread "...

1820
来自专栏大内老A

yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[上篇]

在定义API的时候,对于一些返回集合对象的方法,很多人喜欢将返回类型定义成IEnumerable<T>,这本没有什么问题。这里要说的是另一个问题:对于返回类型为...

1728
来自专栏Linyb极客之路

java反射的二三事

一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息,诸...

3008
来自专栏微信公众号:Java团长

Java动态代理原理及解析

代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类...

534
来自专栏IT大咖说

Getting started with Kotlin on Android

摘要 Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrain设计开发并开源,与Java相比,Kotlin的语法更简洁,更具表达性,而且提供了...

2645

扫码关注云+社区