make 学习体会(一)

简介:
在对makefile进行了部分学习后,感觉到还是多看看简短的例子比较好。

发现下面这个网站讲得很好:

http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/

hellomake.c:

复制代码
#include 
int main() {
  // call a function in another file
  myPrintHelloMake();

  return(0);
}
复制代码
hellofunc.c:

复制代码
#include 
#include 

void myPrintHelloMake(void) {
  printf("Hello makefiles!\n");
  return;
}
复制代码
hellomake.h:

/*
example include file
*/
void myPrintHelloMake(void);
第一个 makefile的例子:

hellomake: hellomake.c hellofunc.c
     gcc -o hellomake hellomake.c hellofunc.c -I.
hellomake 是规则名;它的前提条件是:hellomake.c 和 hellofunc.c。

在此规则中,我们要执行的片段是: gcc -o hellomake hellomake.c hellofunc.c -I

第二个 makefile的例子:

CC=gcc
CFLAGS=-I.

hellomake: hellomake.o hellofunc.o
     $(CC) -o hellomake hellomake.o hellofunc.o -I.
此处定义了 变量 cc 和 CFLAGS , 这也是很多 makefile中很常见的两个变量。

此时,规则 hellomake 依赖于两个目标文件 hellomake.o 和 hellofunc.o ,

而且这里有一个隐含的依赖关系:

hellomake.o 来自于对 hellomake.c 的编译

hellofunc.o 来自于 对 hellofunc.c 的编译

由于为了生成 hellomake,需要 hellomake.o 和 hellofunc.o ,

就意味着实际上需要 hellomake.c 和 hellofunc.c。

$(CC) 就代表了 gcc 命令,此处实际上还尚未使用 CFLAGS 变量。

 

第三个 makefile例子:

复制代码
CC=gcc
CFLAGS=-I.
DEPS = hellomake.h

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: hellomake.o hellofunc.o 
    gcc -o hellomake hellomake.o hellofunc.o -I.
复制代码
%.o: 规则表明:每一个 .o 文件,都是依赖于 同名的 .c 文件,和 DEPS 所定义的头文件。

具体为了生成此 .o 文件,需要进行编译动作:

$(CC) -c -o $@ $< $(CFLAGS)

其中 $(CC) 和 -c -o 都不用解释了。

$@表示的就是 冒号左边的内容,即某个.o 文件。

$<表示的就是 冒号右边的第一个参数,即此同名的.c 文件。

$(CFLAGS) 在这里就是 -I。

 

第四个 makefile例子:

复制代码
CC=gcc
CFLAGS=-I.
DEPS = hellomake.h
OBJ = hellomake.o hellofunc.o 

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS)
复制代码
同上个例子相比,它又定义两个 OBJ变量。

hellomake 依赖于 OBJ变量所指代的目标文件,

gcc -o $@ $^ $(CFLAGS) 中,其他的都不用再解释了。

$^ 是冒号右边的值,这里就是 $(OBJ),也就是 hellomake.o, hellofunc.o。

 

第五个 makefile例子:

复制代码
IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR =../lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 
复制代码
这里面 IDIR,LDIR,ODIR 分别指定了 头文件/库文件/输出目标文件的目录。

来看这一句:

DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
patsubst 是一个 函数,它会把所有 % 所代表的文件字符串,改变为 头文件目录下的 文件字符串。

第三个参数 $(_DEPS)指明了这个 函数的作用范围。

OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 的作法与此类似。

其他的,也没有什么可以说的了,但是 这里有一个伪规则 clean。它是没有前提条件的。

rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 中,

*~ , 我猜测代表的是 所有没有扩展名的文件。core 指代的是程序出错时生成的 core 文件。

标签: Makefile, example


本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/09/17/2688165.html,如需转载请自行联系原作者
目录
相关文章
|
分布式计算 前端开发 Hadoop
【细节拉满】Hadoop课程设计项目,使用idea编写基于MapReduce的学生成绩分析系统(附带源码、项目文件下载地址)(三)
【细节拉满】Hadoop课程设计项目,使用idea编写基于MapReduce的学生成绩分析系统(附带源码、项目文件下载地址)(三)
965 0
|
存储 SQL 大数据
Hive介绍与核心知识点
Hive Hive简介 Facebook为了解决海量日志数据的分析而开发了Hive,后来开源给了Apache软件基金会。 官网定义: The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Hive是一种用类SQL语句来协助读写、管理那些存储在分布式存储系统上大数据集的数据仓库软件。
4817 0
|
SQL 缓存 JSON
Flink CEP 在抖音电商的业务实践
FlinkCEP 是基于 Flink 实现的实时数据规则引擎,支持跨多个事件的规则匹配。然而,当前 FlinkCEP 在多规则处理、规则表达方面还存在易用性问题。本次分享主要介绍 FlinkCEP 在抖音电商业务的应用实践以及易用性优化。
Flink CEP 在抖音电商的业务实践
|
存储 编解码 搜索推荐
Studio One6最新版本及系统安装下载要求
PreSonus今天发布了Studio One 6旗舰级DAW的跨版本升级。他们获奖的DAW软件的这一最新版本引入了大量的新功能和增强功能,包括用户界面的定制选项,PreSonus说这使第6版成为他们迄今为止最个性化的升级。PreSonus发布了旗舰级DAW的跨版本升级,Studio One 6新功能包括智能模板、乐谱支持歌词,全局视频轨,还有全新的声码器插件。
1835 0
|
监控 负载均衡 网络协议
云监控-主机监控功能介绍|学习笔记
快速学习云监控-主机监控功能介绍
388 0
云监控-主机监控功能介绍|学习笔记
|
运维 安全 Linux
iBox-面向Flutter的一站式研发工作台
移动端开发领域面向发布和运维的 Web 版平台有很多,但是面向研发和调试以及把整个研发工作流串联起来的平台确很少,面对端上越来越多的技术栈以及越来越复杂的业务场景,团队的上手成本和协同成本也会大大提高,iBox 的初衷就是想解决这些问题,它也是 Flutter Desktop 技术在生产环境的一次尝试。
1509 1
|
弹性计算 网络安全 数据库
云服务器试用7天或一个月申请流程
阿里云服务器可以免费申请试用,最长可以申请免费使用一个月,阿里云免费试用中心分为个人用户和企业用户,阿里云百科来详细说下云服务器免费试用申请教程
1416 0
云服务器试用7天或一个月申请流程
|
弹性计算 Kubernetes 关系型数据库
基于ECI的ACK集群高弹性架构最佳实践
用户原有的业务部署在阿里云ACK集群上,随着业务波动如何达到成本
899 0
基于ECI的ACK集群高弹性架构最佳实践
|
存储 Cloud Native 多模数据库
|
Android开发 iOS开发 C++
Flutter 设置 App 的应用名字和应用 logo 图标的方法
Flutter 设置 App 的应用名字和应用 logo 图标的方法, 知识点虽然简单,但是不知道这个知识点就不行,所以还是要记录下来,分享一下。 其实,Flutter 设置 App 的应用名称和图标是要分开来操作的,Android 和 iOS 是分开设置对应的 App 名称和图标的,这一点一定要注意。也可以把 Android 和 iOS 的应用名称和图标分开设置,可以设置不一样,但是毕竟一个 App 为了保证一致性,还是不要这样做,老老实实保证 Android 和 iOS 两个端的应用信息保持一致吧。
1507 0
Flutter 设置 App 的应用名字和应用 logo 图标的方法