[转]C++ 使用Makefile文件
//*********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)
转载于:https://www.cnblogs.com/moher/p/3238145.html
[转]C++ 使用Makefile文件相关推荐
- makefile文件编写教程
技术交流QQ群:1027579432,欢迎你的加入! 1.make介绍 gcc:编译器(gcc根据菜谱进行编译) make: linux自带的构建器(相当于一个菜谱) 构建的规则(菜谱)在makefi ...
- 解析Makefile文件的构建规则
2019独角兽企业重金招聘Python工程师标准>>> Makefile 编辑一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则 ...
- 例解 autoconf 和 automake 生成 Makefile 文件
http://www.ibm.com/developerworks/cn/linux/l-makefile/ 生成 Makefile 的来龙去脉 首先进入 project 目录,在该目录下运行一系列命 ...
- Makefile文件应用——huge项目
提高复用性 在build目录下,保存公用部分make.rule (1)绝对路径 用ROOT变量保存项目根目录 (2)增加控制变量 EXE/LIB/ (3)头文件查找目录 gcc 的-I(i的大写)选项 ...
- Makefile文件的编写规则
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...
- Makefile文件的使用
先看下面的Makefile代码: # Makefile for boot # Programs, flags, etc. ASM = nasm ASMFLAGS = -I incl ...
- MakeFile 文件的作用
makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取makefi ...
- VS.net下编写makefile文件--NMAKE用法
1.程序源文件: 如有三个文件:主文件:hello.cpp,类NUM的说明和实现文件:Num.h和Num.cpp,内容如下: main.cpp: #include "iostream&quo ...
- makefile文件简要介绍
到此为止,读者已经了解了如何在Linux下使用编辑器编写代码,如何使用Gcc把代码编译成可执行文件,还学习了如何使用Gdb来调试程序,那么,所有的工作看似已经完成了,为什么还需要Make这个工程管理器 ...
最新文章
- 不用GPU,稀疏化也能加速你的YOLOv3深度学习模型
- oracle hyperion招聘,Hyperion Planning功能顾问
- Sqlmap爆库命令的简单使用
- 阶乘数码(洛谷P1591题题解,Java语言描述)
- 【程序性能分析利器】Google Perf Tool 和 Valgrind 工具包简介
- 用计算机计算麦克斯韦方程,数学之美~(01)最伟大的数学公式!
- 注解@controller的作用_@controller和@Restontroller区别
- 文本居于图片左侧html,CSS实现图片与文本的居中对齐的常见方式
- Python 16th Day
- ubuntu下python安装pandas和numpy等依赖库版本不兼容的问题RuntimeWarning: numpy.dtype size changed...
- 微服务 前台调用后台的慢的原因_也只有阿里P8出身的他能把SpringCloud微服务架构商城项目整的这么干了...
- CocosBuilder学习之一:认识CocosBuilder
- Spring-boot-2.1.X源码编译
- 计算机除数的时候怎么会有分数,在做除法运算时,为什么0不能做除数?
- Java项目:SpringBoot人才求职招聘网站
- 录音转成文字的方法分享
- 【随笔杂记】电脑断电自启+远程控制自启
- 13、Nepxion Discovery 之 全链路调用链监控
- win10 wifi连接不上服务器未响应,简单几步解决win10wifi一直断开连接不上的问题...
- 英语作文计算机国际会议开幕词,英语作文会议开幕词
热门文章
- 计算机入域时域控用到的端口,AD域控制器使用端口的说明
- 绝地求生现在服务器稳定吗,吃鸡服务器不稳定?《绝地求生》国服宣布将首次使用超性能服务器...
- 求e的近似值java_7-78 求e的近似值 (15 分)
- linux mysql 5.0.45_RedHat糸列Mysql-5.0.45的安装
- Zookeeper watch机制
- Java线程池中submit()和execute()方法有什么区别
- java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...
- 存款利息python题_python入门教程NO.8 用python写个存款利息计算器 已
- python中install语法错误_在“ npm install”之后,出现有关python中语法错误的错误吗?...
- ffmpeg库编译加文字_使用ffmpeg库编译错误及解决办法