make命令和makefile文件

Thu Jun 04 13:59:18 CST 2015 696 C/C++

文章摘要makefile文件定义了一个project的编译规则;make命令负责执行makefile里的规则。

往往在一个project中,源文件数目比较多,开发者一般会把源文件按类型、功能、模块分别放在若干个目录中;然而在没有强大的IDE情况下,要编译这样一个project则会很复杂,也容易出错;这个时候就可以借助make命令和makefile文件了。makefile文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更高级的功能操作,例如操作系统的命令。


makefile的编写规则:

target ... : prerequisites ...
command
...
...


target是一个目标文件,可以是Object File,也可以是执行文件,还可以是一个标签(伪目标);
prerequisites是生成target所需要的文件或目标;
command是make需要执行的命令。

若target不存在或者target依赖的文件比已存在的target更新,那么对应的命令就会被执行;若发现target依赖的文件不存在,那么make就会寻找生成这个依赖文件的对应规则...这类似于栈。


例子:

新建一个目录,建立以下文件

makefile文件:

hello:hello.o function.o
    gcc -O hello.o function.o -o hello
hello.o:hello.c head.h
    gcc -c hello.c
function.o:function.c head.h
    gcc -c function.c


hello.c文件

#include <stdio.h>
#include "head.h"

int main(int argc, char* argv[]){
  int n = sum(1,2);
  printf("sum is %d\n", n);
  return 0;
}


head.h文件

#ifndef _HEAD
#define _HEAD

int sum(int a, int b);

#endif


function.c文件

#include <stdio.h>
#include "head.h"

int sum(int a, int b){
  return a+b;
}


在终端中进入到上面的目录中,执行make命令(make会自动在当前目录中寻找makefile文件或者Makefile文件,也可以通过-f参数来指定),可以看到以下输出

gcc -c hello.c
gcc -c function.c
gcc -O hello.o function.o -o hello


这时看看目录中,会发现生成了三个文件:hello.o, function.o, hello。其中hello.o和function.o是中间目标文件,hello就是最终的可执行程序。

终端键入./hello执行hello文件,可以看到程序输出了sum is 3



打赏
打赏

分享到: