makefile代码实战

6 篇文章 1 订阅

makefile是为编译程序代码而生,有以下要点:

1、源代码文件(c,cpp)转换成中间代码文件(.obj/.o)文件:这个过程叫编译 compile。
2、中间代码文件合成可执行文件,这个过程叫链接 link。
3、如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。 
4、如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。          
5、如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
6. 显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
7. 隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
8. 变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
9. 文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。
10.  注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“\#”。

11、makefile文件写好后,只要一个make命令,操作系统就会读取当前目录下的makefile文件,并按照makefile文件的内容规则有序编译整个工程代码。

12、makefile的书写规则如下:

 target... : prerequisites ...

          command

          ...

          ...
         -------------------------------------------------------------------------------

       target 编译目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性。

       prerequisites,生成target所依赖的文件或目标。

       command make需要执行的命令。(任意的Shell命令)
      这是一个源文件和目标文件的依赖关系,target是一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则,也是Makefile中最核心的内容。


13、代码实例

为了说清楚makefile文件的写法,特别写了以下c++程序代码,包括5个.cpp文件(main.cpp,make1.cpp,make2.cpp,make3.cpp,make4.cpp)和4个.h(make1.h,make2.h,make3.h,make4.h)文件,还有一个makefile文件,使用make命令编译出可执行目标文件makefile_test。代码文件内容贴到下而

以下是makefile文件内容
# my first makefile for a c++ project makefile_test
# 2018-5-21 by kevin


#makefile_test : main.o make1.o make2.o make3.o make4.o   #这是最直接的写法,下面改成了变量的方式,方便维护
#	g++ -o makefile_test main.o make1.o make2.o make3.o make4.o

objects = main.o make1.o make2.o make3.o make4.o   #把.o串给变量objects

makefile_test : $(objects)       #链接成最终目标所依赖的中间目标文件  .o文件
	g++ -o makefile_test $(objects)   #编译链接命令

main.o : main.cpp make1.h
	g++ -c -g main.cpp     #-c only compile to middle tag file *.o  -g debug compile type

make1.o : make1.cpp make1.h make2.h     #编译目标make1.o所依赖的源文件
	g++ -c -g make1.cpp        #编译命令

make2.o : make2.cpp make2.h make3.h
	g++ -c -g make2.cpp

make3.o : make3.cpp make3.h make4.h
	g++ -c -g make3.cpp

make4.o : make4.cpp make4.h
	g++ -c -g make4.cpp

.PHONY : clean    # .PHONY 指明clean是个伪目标。 伪目标:在这里指不存在的文件,并不能与其他文件建立依赖,所以叫做伪目标。
clean:
	#rm makefile_test main.o make1.o make2.o make3.o make4.o
	rm makefile_test $(objects)
main.cpp
#include <iostream>
#include "make1.h"

int main(int argc,char **argv)
{
    std::cout<<"calling fuction main"<<std::endl;
    int aa = make1(80);
    std::cout<<"number = "<<aa<<std::endl;
    return aa;
}
make1.h
int make1(int a1);
make1.cpp
#include <iostream>
#include "make1.h"
#include "make2.h"

int make1(int a1)
{
    std::cout<<"calling fuction make1"<<std::endl;
    return make2(a1)+1;
}
make2.h
int make2(int a2);
make2.cpp
#include <iostream>
#include "make2.h"
#include "make3.h"

int make2(int a2)
{
    std::cout<<"calling fuction make2"<<std::endl;
    return make3(a2)+2;
}
make3.h
int make3(int a3);
make3.cpp
#include <iostream>
#include "make3.h"
#include "make4.h"

int make3(int a3)
{
    std::cout<< "calling function make3"<<std::endl;
    return make4(a3) + 3;
}
make4.h
int make4(int a4);
make4.cpp
#include <iostream>
#include "make4.h"

int make4(int a4)
{
    std::cout<<"calling function make4"<<std::endl;
    return a4+4;
}








  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值