//*********list class.h**********
class tdate {
private:
int month;
int day;
int year;
public:
tdate();
tdate(int t_month, int t_day, int t_year) {
……
}
//tdate(const tdate &obj)
//{}
void display();
};
//********list class.c++:************
#include "class.h"
void tdate::display() {
int main()
{
tdate t1(12,30,2007);
t1.display();
return 0;
}

当然由于这个程序很短,我们可以这样来编译:
g++ -c class.c++
g++ -o main1 main1.c++ class.o
这样的话我们也可以产生main程序,而且也不是很麻烦。但是如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?因为SHELL脚本将全部编译作任何源文件,包括那些不必要重新编译的源文件,而make工具则可根据目标上一次编译的时间和目标文件所依赖的源文件的更新时间而自动判断应当编译哪个源文件
现在我们来编写这个makefile文件
(文件名为makefile)
**********list makefile*******
# 这是上面那个程序的Makefile文件:
main1:main1.o class.o
g++ -o main1 main1.o class.o
main1.o: main1.c++ class.h
g++ -c main1.c++
class.o: class.c++ class.h
g++ -c class.c++
clean:
rm *.o
*******it is over**********
现在只要在shell下输入make命令,就能完成编译过程。再输入./main1就可以运行程序

有了这个Makefile文件,不论我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件它连理都不想去理的。如果程序没有改动,它就会提示你“main1 is up to date”,然后不会编译。

下面我们学习Makefile是如何编写的。
在Makefile中以#开始的行都是注释行。Makefile中最重要的是描述文件的依赖关系的说明。
一般的格式是:
target:dependency [dependency [........] ]
command
command
[.............]
目标(target):make最终要创建的文件
依赖关系列表(dependency): 通过这张列表可以知道编译目标需要用到的文件
命令列表(command): 为了从指定的依赖关系创建创建出目标文件而需要执行的命令。这些命令不仅是编译命令,还可以shell命令。
第一行表示的是依赖关系。第二行是命令。
比如说我们上面的那个Makefile文件的第一行。
main1:main1.o class.o
表示我们的目标(target)main的依赖对象(dependency)是main1.o class.o 当依赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令。就象我们的上面那个Makefile第二行所说的一样要执行 g++ -o main1 main1.o class.o

注意:命令行是以TAB键开始的
Makefile有三个非常有用的变量。分别是$@,$^,$#' are comments
$@ --目标文件 
$^ --所有的依赖文件 
$< --第一个依赖文件

如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:

# 这是简化后的Makefile (提示:要用变量,就所有的都用变量,不然就不能正常运行)

main1:main1.o class.o

g++ -o $@ $^

main1.o:main1.c++ class.h

g++ -c $<

class.o: class.c++ class.h

g++ -c $<

clean:

rm *.o

经过简化后,我们的Makefile是简单了一点,不过人们有时候还想简单一点。这里我们学习一个Makefile的缺省规则

.c++.o:

g++ -c $<

这个规则表示所有的 .o文件都是依赖与相应的.c++文件的。例如class.o依赖于class.c++这样Makefile还可以变为:

# 这是再一次简化后的Makefile

main1:main1.o class.o

g++ -o $@ $^

.c++.o:

g++ -c $<

clean:

rm *.o

其实,如果有很多个程序,而又是跨平台时,那就得修改命令,如上面的,假如要修改g++ -c,不知要修改多少呀,为了修改方便,我们可以用变量来代替。如下:

*******makefile*********

#started with '#' are comments

gx="g++ -c"

main1: main1.o class.o

#g++ -o main1 main1.o class.o

g++ -o $@ $^

main1.o: main1.c++ class.h

#g++ -c main1.c++

#g++ -c $<

$(gx) $<

class.o: class.c++ class.h

g++ -c $<

clean:

rm *.o

**********************************************************************************
下面是我在用的Makefile文件,带有一些参数。从OCCI带的例子里面改过来的。
***********************************************************************************
###########################################

ORACLE_INCLUDES=-I$(ORACLE_HOME)/rdbms/public \
-I$(ORACLE_HOME)/plsql/public \
-I$(ORACLE_HOME)/network/public \
-I$(ORACLE_HOME)/precomp/public

ORACLE_LIBS=-L$(ORACLE_HOME)/lib -L$(ORACLE_HOME)/rdbms/lib
CC=g++
#CC_FLAG=-Wno-deprecated -fPIC -march=i486
CC_FLAG=-Wall
INC=$(ORACLE_INCLUDES)
LIB=$(ORACLE_LIBS) -lclntsh -locci -lxerces-c -lpthread

PRG=occi
SRC=occi.cpp
OBJ=occi.o

$(PRG):    $(OBJ)
@echo "Link $(OBJ) to $(PRG) begin......"
$(CC) $(CC_FLAG) $(INC) $(LIB) -o $@ $<
@echo "Link $(OBJ) to $(PRG) end......"

$(OBJ):    $(SRC)
@echo "Compile $(OBJ) begin......"
$(CC) $(CC_FLAG) $(INC) $(ORACLE_LIBS) -c $<
@echo "Compile $(OBJ) end......"

clean:
@echo "Removing linked and compiled files......"
rm -f $(OBJ) $(PRG)

[转]C++ 使用Makefile文件的更多相关文章

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

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

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

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

  3. Makefile文件学习总结

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

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

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

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

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

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

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

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

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

  8. linux中Makefile文件相关内容

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

  9. 使用automake等命令自动生成Makefile文件 (转载)

    使用automake等命令自动生成Makefile文件   Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...

  10. C++学习笔记25:makefile文件2

    Makefile文件语法 行解析:命令按行解析 命令行的行首字符为Tab键,其他行的行首字符不得为Tab键,但可以使用多个空格缩进 换行:命令太长时,行尾使用"\"换行 注释:行首 ...

随机推荐

  1. SQL LIKE 运算符

    SQL LIKE 运算符 在WHERE子句中使用LIKE运算符来搜索列中的指定模式. SQL LIKE 操作符 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. 有两个通配符与LIKE运 ...

  2. Robot Framework:变量与运算

    设置变量                                                                                                ...

  3. cf期望概率专题

    cf1009E:求到第i段期望和的比较困难,但是单独求每段的期望是比较容易的,所以单独对每段求和,然后累计总和 E[i]=1/2*a1+1/4*a2+...+1/2^(i-1)*ai-1+1/2^(i ...

  4. Arduino与无源蜂鸣器

    1.Arduino无源蜂鸣器传感器模块 我们可以使用Arduino进行很多互动作品,其中最常用的是声光显示器.之前的所有实验都与LED有关.但是,这个实验中的电路可以产生声音.通常,实验是通过蜂鸣器或 ...

  5. 浅谈虚拟机、Docker和Hyper技术

    操作系统 我们知道: 完整的操作系统=内核+apps 内核负责管理底层硬件资源,包括CPU.内存.磁盘等等,并向上为apps提供系统调用接口,上层apps应用必须通过系统调用方式使用硬件资源,通常并不 ...

  6. nginx填坑补充(nginx根据上下文跳转ip或者域名)

    今天有一个需求,要根据上下文调到不同的ip或域名地址,使用上下文做域名跳转的时候,proxy_pass域名后面一定要带‘/’否则会把nginx的上下文自动带入,这样就行. location ^~ /d ...

  7. Mysql DBA

    1 mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `tb_co ...

  8. 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)

    题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...

  9. JUC源码分析-线程池篇(三)Timer

    JUC源码分析-线程池篇(三)Timer Timer 是 java.util 包提供的一个定时任务调度器,在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次. 1. Ti ...

  10. centos7部署汉化版gitlab

    =============================================== 2018/6/5_第7次修改                       ccb_warlock 更新说 ...