一个项目下的文件比较多,如果单个的输入,比较费劲,所以就需要把编译过程写进一个MakeFile文件中。

下面建立5个文件,3个cxx文件,2个hxx头文件

//filename main.cxx

#include<iostream>
#include"printf1.hxx"
#include"printf2.hxx" using namespace std; int main(void)
{
cout<<"Hello World!"<<endl;
printf1();
printf2();
return 0;
}
//filename printf1.cxx

#include "printf1.hxx"
#include <iostream> using namespace std; void printf1()
{
cout<<"Printf1"<<endl;
}
//filename printf2.cxx

#include "printf2.hxx"
#include <iostream> using namespace std; void printf2()
{
cout<<"Printf2"<<endl;
}
//filename printf1.hxx

#ifndef _PRINTF_1_H_
#define _PRINTF_1_H_ void printf1(); #endif
//filename printf2.hxx

#ifndef _PRINTF_2_H_
#define _PRINTF_2_H_ void printf2(); #endif

 makefile的内容:

cc=g++
exe=main
obj=main.o printf1.o printf2.o $(exe):$(obj)
$(cc) -o $(exe) $(obj)
main.o:main.cxx
$(cc) -c main.cxx
printf1.o:printf1.cxx
$(cc) -c printf1.cxx printf2.o:printf2.cxx
$(cc) -c printf2.cxx .PHONY : clean
clean:
rm -rf *.o main

其中 cc=g++

exe=main

obj=main.oprintf1.o printf2.o

为变量的定义,$(...)作为引用,可以分析一下,是不是和上文中单个操作效果一样?

执行过程:

$ make

g++ -c main.cxx

g++ -c printf1.cxx

g++ -c printf2.cxx

g++ -o main main.o printf1.o printf2.o

下面我们来看一下makefile的规则:

target...:prerequisites...

comand

...

...

target是目标文件,可以是Object File 也可以是执行文件,也可以是一个标签(Lable)。

prerequisites是要生成target文件所需的文件或目标。

command 就是make需要执行的命令了。

这是一个文件的依赖关系,也就是说,target 这一个或多个的目标文件依赖于 prerequisites 中的文件,这种方法,也就是 make 的“隐晦规则”。其生成规则定义在 command 中。

说白一点就是说, prerequisites 中如果有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行。

这就是 Makefile 的规则。也就是 Makefile 中最核心的内容。

.PHONY 意思表示 clean 是一个“伪目标”。而在 rm 命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。

当然,clean 的规则不要放在文件的开头,不然,这就会变成 make 的默认目标,相信谁也不愿意这样。

不成文的规矩是——“clean 从来都是放在文件的最后”。

 

 

 

  

  

简单makefile的写法的更多相关文章

  1. 多个文件目录下Makefile的写法

    1.前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile.关于Makefile的详细内容可以参考网上流传非常广泛的<跟我一起写Ma ...

  2. 操作系统(5)实验0——makefile的写法

    之前GCC那部分我提到过,gcc啥啥啥啥傻傻的那个指令只能够编译简单的代码,如果要干大事(例如突然心血来潮写个c开头的神经网络库之类的),还是要写Makefile来编译.其实在Windows下通常用I ...

  3. [转] 多个文件目录下Makefile的写法

    1.前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile.关于Makefile的详细内容可以参考网上流传非常广泛的<跟我一起写Ma ...

  4. 1、编写一个简单Makefile模板

    一.Makefile简介 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译, ...

  5. makefile文件写法解析

    一.makefile文件示例 makefile文件并不难写,一个makefile模版如下所示,所有makefile文件在此基上稍微修改就可以了. # this is a makefile #这一行是注 ...

  6. 简单makefile示例

    Makefile cmd: - g++ 相信在linux下编程的没有不知道makefile的,刚开始学习linux平台下的东西,了解了下makefile的制作,觉得有点东西可以记录下. 下面是一个极其 ...

  7. gtk编译之makefile的写法(之一)

    在学习c语言GUI编程时想必大家都会遇见这样一个问题买就是每次编译都要敲`pkg-config --cflags --libs gtk+-2.0`这个烦恼吧 这是我们可以编写一个makefile文件这 ...

  8. 通用多目录makefile的写法

    我的项目文件层次是:项目名称/include.output.src src/admin.stu.tch.common 最外层的Makefile: DEBUG = yMYDEBUG = DEBUGife ...

  9. boost 源码编译 的 Makefile.am写法备份

    include $(top_srcdir)/common.mk bin_PROGRAMS= lib_LIBRARIES= lib_LTLIBRARIES= lib_LTLIBRARIES+=libSt ...

随机推荐

  1. JavaWeb核心编程之(三.5)HTTP请求和接受表单数据

    HTTP简介WEB浏览器与WEB拂去其之间的一问一答的交互过程, 必须遵循一定的规则,这个规则就是HTTP协议HTTP是hypertext transfer protocol(超文本传输协议)的简写, ...

  2. Spring中ref local与ref bean区别

    今天在做SSH框架Demo实例时,在ApplicationResources.properties文件时对<ref bean>与<ref local>感到不解,经查找资料才弄明 ...

  3. 周末苦逼码代码,为css3的强大所颤抖了

    周末小哥我看完了几个星期没追的行尸走肉和生活大爆炸(感谢大A站!),感觉生活真的好空虚,没想到我现在居然会对游戏失去了兴趣!!!代码的魔力真的是无法用语言形容...(我真假...)百无聊赖,在电脑上装 ...

  4. OpenCV学习 5:关于平滑滤波器 cvSmooth()函数

    原创文章,欢迎转载,转载请注明出处 本节主要了解下cvSmooth函数的一些参数对结果的影响.从opencv tutorial中可以看到这样一段话: 像我这样的数学渣,还是看下图来得形象: 高斯滤波器 ...

  5. “Options模式”下各种类型的Options对象是如何绑定的?

    “Options模式”下各种类型的Options对象是如何绑定的? 旨在生成Options对象的配置绑定实现在IConfiguration接口的扩展方法Bind上.配置绑定的目标类型可以是一个简单的基 ...

  6. scss + react + webpack + es6

    scss + react + webpack + es6 写在前面: 刚学习完慕课网里的一个幻灯片案例,自己加了刚学的react,两者结合.首先让大家看看效果 点击此处 你可以先用纯js实现上面的效果 ...

  7. MySQL二进制日志中保存的上下文信息

    1.二进制日志中要保存上下文的原因 二进制日志是要在slave端重放的,记录上下文信息,是为了保证主丛数据库的一致.如rand一个随机数,在主上返回的可以有是100,在从上返回的可能就是1000了. ...

  8. delphi 基础书籍推荐

    本文所推荐的书,我均仔细读过,受益良多. 1. Pascal 精要.下载Pascal精要 本书讲Pascal 语言基本知识. 2. Object Pascal 参考(中英文对照版).下载Object ...

  9. MyBatis 最常见错误,启动时控制台无限输出日志

    你是否遇到过下面的情况,控制台无限的输出下面的日志: Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImp ...

  10. rsyslog masg和rawmsg的区别

    msg the MSG part of the message (aka "the message" ;)) message 的MSG 部分 rawmsg the message ...