makefile文件采用依赖倒推的模式进行编译。

主要由以下几步构成:

1 申明

2 default 默认生成的对象

3 TARGET 链接过程

4 cpp 编译过程

5 生成一个version.h文件

6 一个空force过程

附上一个测试文件

  1. .PHONY: default
  2. SYSNAME=$(shell uname -s)
  3. ifeq ($(SYSNAME),Darwin)
  4.         ECHO=echo
  5. else
  6.         ECHO=echo -e
  7. endif
  8. CXX = g++
  9. CFLAGS = -pg -Wall -std=c++0x
  10. PRO_HOME=~/build-env/build-system
  11. LDFLAGS = -L $(PRO_HOME)/3rd-soft/lib/
  12. CLINC = -I $(PRO_HOME)/3rd-soft/include/
  13. LDLIBS = -ljsoncpp -lsybdb -lgcrypt -lcurl -luuid -lglog -ljsoncpp
  14. SOURCES = $(wildcard *.cpp ./common/*.cpp)
  15. OBJECTS = $(patsubst %.cpp,%.o,$(SOURCES))
  16. TARGET=program_name
  17. # TODO: 这里加入所有默认需要编译的目标
  18. default: version.h $(TARGET)
  19.     @echo Generation default ...
  20. # 链接过程
  21. ${TARGET}: $(OBJECTS)
  22.     @echo Generation TARGET ...
  23.     $(CXX) $(OBJECTS) $(CLINC) $(LDFLAGS) $(LDLIBS) -o $(TARGET)
  24.     cp -f $(TARGET) ../bin/$(TARGET)
  25. # 编译过程
  26. %.o : %.cpp
  27.     @echo Generation cpp ...
  28.     $(CXX) -c $(CFLAGS) $(CLINC) $(LDFLAGS) $(LDLIBS) $< -o $@
  29. # 下面是每个目标的生成过程
  30. TEST_PROGRAM_NAME=AS
  31. TEST_PROGRAM_NAME_CN=模块名简介
  32. MAIN_VERSION_STRING="1.0.0"
  33. VERSION_STRING:=$(shell LANG=C git log --oneline -1 2>/dev/null |cut -c1-7)
  34. version.h: force
  35.     @echo Generation version.h ...
  36.     @$(ECHO) "# ifndef  __TEST_SERVICE_VERSION_H__\n\
  37.     # define __TEST_SERVICE_VERSION_H__\n\
  38.     # define SERVICE_VERSION_STRING \"$(MAIN_VERSION_STRING).$(VERSION_STRING)\"\n\
  39.     # define TEST_PROGRAM_NAME \"$(TEST_PROGRAM_NAME)\"\n\
  40.     # define TEST_PROGRAM_NAME_CN \"$(TEST_PROGRAM_NAME_CN)\"\n\
  41.     # endif" > version.h
  42.     
  43. force:
  44.     @echo Generation force ...
  45. # 程序的生成过程 {{{
  46. # }}}

运行以后打印整理如下:

  1. Generation force ...
  2. Generation version.h ...
  3. Generation cpp ...
  4. Generation targets ...
  5. Generation default ...

由此可见,实际运行时程序由下往上,按各自的依赖关系,先执行被依赖的部分。

关于makefile文件研究的更多相关文章

  1. 转:SYNOPSYS VCS Makefile文件编写与研究

    SYNOPSYS VCS Makefile文件编写与研究 这个Makefile是synopsys提供的模板,看上去非常好用,你只要按部就班提供实际项目的参数就可以了.我们来看这个文件的头部说明:mak ...

  2. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  3. Linux工具入门:make工具与Makefile文件

    1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...

  4. Makefile文件学习总结

    Makefile文件相当于是一种脚本编程语言,目的是实现自动化编译.编写makefile文件的过程中可以使用变量.控制结构和函数等一般编程语言的特性. Makefile文件的组成内容.makefile ...

  5. 利用 autoconf 和 automake 生成 Makefile 文件

    一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...

  6. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  7. Ubuntu ./configure 半途终止 导致没有生成makefile文件 解决方法

    在安装thrift的时候,解压包进入目录,执行命令: ./configure 之后,发现某些包没有安装,导致configure到一半的时候退出,接着make发现没有makefile文件.估计是我系统安 ...

  8. 【OpenWRT】【RT5350】【三】MakeFile文件编写规则和OpenWRT驱动开发步骤

    一.Makefile文件编写 http://www.cnblogs.com/majiangjiang/articles/3218002.html 可以看下上面的博客,总结的比较全了,在此不再复述 二. ...

  9. linux中Makefile文件相关内容

    第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...

随机推荐

  1. 利用babel-cli搭建支持ES6的node环境

    现在ES6盛行,开始大量使用ES6的特性敲代码,但限于Node.js本身对ES6的特性支持的不够完备,那么需要借助于其他工具来完成. 基本上,现在都直接写ES6的代码,然后使用babel-cli提供的 ...

  2. sql2005分页储存过程和C#分页类

    1.sql2005分页储存过程 --sql2005,qq524365501 create Procedure up_page2005 ), -- 表名称 ), -- 列 ), -- 主键,用于统计总数 ...

  3. 使用PostgreSQL遇到的一个问题[column does not exist]字段不存在:

    表结构: 在我上面的表结构中,明明有一个叫做"fromdeviceId"的字段,但是查询的时候却提示找不到该字段: 仔细观察错误信息,发现,我的字段明明是有一个大写字母(fromd ...

  4. Java中的异常处理:何时抛出异常,何时捕获异常,何时处理异常?

    Java中的异常处理:何时抛出异常,何时捕获异常? 2017-06-07 1 异常分类 Throwable对象可以分为两组: 一组是unchecked异常,异常处理机制往往不用于这组异常,包括: Er ...

  5. S3C2440时钟体系结构

    任意一款单板,我们了解其时钟都是通过时钟树来的. 这里没有全部截完,只是讲解时钟来源,OSC代表晶振,这说明我们的时钟可以来至晶振OSC也可以来至外部输入EXTCLK,这是通过OM选择器来完成的. 2 ...

  6. Spring事务管理要点总结

    # Spring事务管理要点总结 ### 要点---- 事务是企业级应用中必不可缺少的技术,用来确保数据的完整性和一致性.- Spring事务管理并不实现事务管理的实现,而是借助Hibernate\J ...

  7. Java多线程中的Runnable和Thread

    摘要: 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的r ...

  8. mysql 实现多列唯一性约束

    alter table j_assistants add constraint unique_name_course_class unique(name_id,course_id,class_id);

  9. Java编程的逻辑 (74) - 并发容器 - ConcurrentHashMap

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  10. 初学Struts2

    1.新建工程,引用Struts2 项目结构如下: 2.Web配置,web.xml: <?xml version="1.0" encoding="UTF-8" ...