关于makefile文件研究
makefile文件采用依赖倒推的模式进行编译。
主要由以下几步构成:
1 申明
2 default 默认生成的对象
3 TARGET 链接过程
4 cpp 编译过程
5 生成一个version.h文件
6 一个空force过程
附上一个测试文件
.PHONY: default SYSNAME=$(shell uname -s) ifeq ($(SYSNAME),Darwin) ECHO=echoelse
ECHO=echo -eendif
CXX = g++ CFLAGS = -pg -Wall -std=c++0x PRO_HOME=~/build-env/build-system LDFLAGS = -L $(PRO_HOME)/3rd-soft/lib/ CLINC = -I $(PRO_HOME)/3rd-soft/include/ LDLIBS = -ljsoncpp -lsybdb -lgcrypt -lcurl -luuid -lglog -ljsoncpp SOURCES = $(wildcard *.cpp ./common/*.cpp)OBJECTS = $(patsubst %.cpp,%.o,$(SOURCES))
TARGET=program_name
# TODO: 这里加入所有默认需要编译的目标
default: version.h $(TARGET)
@echo Generation default ...
# 链接过程
${TARGET}: $(OBJECTS)
@echo Generation TARGET ...
$(CXX) $(OBJECTS) $(CLINC) $(LDFLAGS) $(LDLIBS) -o $(TARGET)
cp -f $(TARGET) ../bin/$(TARGET)
# 编译过程
%.o : %.cpp
@echo Generation cpp ...
$(CXX) -c $(CFLAGS) $(CLINC) $(LDFLAGS) $(LDLIBS) $< -o $@
# 下面是每个目标的生成过程
TEST_PROGRAM_NAME=AS
TEST_PROGRAM_NAME_CN=模块名简介
MAIN_VERSION_STRING="1.0.0"
VERSION_STRING:=$(shell LANG=C git log --oneline -1 2>/dev/null |cut -c1-7)
version.h: force
@echo Generation version.h ...
@$(ECHO) "# ifndef __TEST_SERVICE_VERSION_H__\n\
# define __TEST_SERVICE_VERSION_H__\n\
# define SERVICE_VERSION_STRING \"$(MAIN_VERSION_STRING).$(VERSION_STRING)\"\n\
# define TEST_PROGRAM_NAME \"$(TEST_PROGRAM_NAME)\"\n\
# define TEST_PROGRAM_NAME_CN \"$(TEST_PROGRAM_NAME_CN)\"\n\
# endif" > version.h
force:
@echo Generation force ...
# 程序的生成过程 {{{
# }}}
运行以后打印整理如下:
Generation force ... Generation version.h ... Generation cpp ... Generation targets ... Generation default ...
由此可见,实际运行时程序由下往上,按各自的依赖关系,先执行被依赖的部分。
关于makefile文件研究的更多相关文章
- 转:SYNOPSYS VCS Makefile文件编写与研究
SYNOPSYS VCS Makefile文件编写与研究 这个Makefile是synopsys提供的模板,看上去非常好用,你只要按部就班提供实际项目的参数就可以了.我们来看这个文件的头部说明:mak ...
- 编写一个通用的Makefile文件
1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...
- Linux工具入门:make工具与Makefile文件
1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...
- Makefile文件学习总结
Makefile文件相当于是一种脚本编程语言,目的是实现自动化编译.编写makefile文件的过程中可以使用变量.控制结构和函数等一般编程语言的特性. Makefile文件的组成内容.makefile ...
- 利用 autoconf 和 automake 生成 Makefile 文件
一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...
- linux下使用automake工具自动生成makefile文件
linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...
- Ubuntu ./configure 半途终止 导致没有生成makefile文件 解决方法
在安装thrift的时候,解压包进入目录,执行命令: ./configure 之后,发现某些包没有安装,导致configure到一半的时候退出,接着make发现没有makefile文件.估计是我系统安 ...
- 【OpenWRT】【RT5350】【三】MakeFile文件编写规则和OpenWRT驱动开发步骤
一.Makefile文件编写 http://www.cnblogs.com/majiangjiang/articles/3218002.html 可以看下上面的博客,总结的比较全了,在此不再复述 二. ...
- linux中Makefile文件相关内容
第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...
随机推荐
- 利用babel-cli搭建支持ES6的node环境
现在ES6盛行,开始大量使用ES6的特性敲代码,但限于Node.js本身对ES6的特性支持的不够完备,那么需要借助于其他工具来完成. 基本上,现在都直接写ES6的代码,然后使用babel-cli提供的 ...
- sql2005分页储存过程和C#分页类
1.sql2005分页储存过程 --sql2005,qq524365501 create Procedure up_page2005 ), -- 表名称 ), -- 列 ), -- 主键,用于统计总数 ...
- 使用PostgreSQL遇到的一个问题[column does not exist]字段不存在:
表结构: 在我上面的表结构中,明明有一个叫做"fromdeviceId"的字段,但是查询的时候却提示找不到该字段: 仔细观察错误信息,发现,我的字段明明是有一个大写字母(fromd ...
- Java中的异常处理:何时抛出异常,何时捕获异常,何时处理异常?
Java中的异常处理:何时抛出异常,何时捕获异常? 2017-06-07 1 异常分类 Throwable对象可以分为两组: 一组是unchecked异常,异常处理机制往往不用于这组异常,包括: Er ...
- S3C2440时钟体系结构
任意一款单板,我们了解其时钟都是通过时钟树来的. 这里没有全部截完,只是讲解时钟来源,OSC代表晶振,这说明我们的时钟可以来至晶振OSC也可以来至外部输入EXTCLK,这是通过OM选择器来完成的. 2 ...
- Spring事务管理要点总结
# Spring事务管理要点总结 ### 要点---- 事务是企业级应用中必不可缺少的技术,用来确保数据的完整性和一致性.- Spring事务管理并不实现事务管理的实现,而是借助Hibernate\J ...
- Java多线程中的Runnable和Thread
摘要: 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的r ...
- mysql 实现多列唯一性约束
alter table j_assistants add constraint unique_name_course_class unique(name_id,course_id,class_id);
- Java编程的逻辑 (74) - 并发容器 - ConcurrentHashMap
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- 初学Struts2
1.新建工程,引用Struts2 项目结构如下: 2.Web配置,web.xml: <?xml version="1.0" encoding="UTF-8" ...