关于Linux下Make详细用法


关于make的详细用法,看看《GNU-Make手册v.380.pdf》(下载在),是一本非常不错的资料,第一章概述给出了基本的make的用法。鉴于上面没有给出实际的例子,我将一个简单的例子列出。

源程序如下:

main.c

#include<stdio.h>

#include"addtest.h"

#include"subtest.h"

#include"multest.h"

int main(void)

{

        inta = 6, b = 8;

        intadd,mul,sub;

        add= addtest(a,b);

        mul= multest(a,b);

        sub= subtest(a,b);

        printf("add= %d,mul = %d,sub = %d",add,mul,sub);

        return0;

}

 

 

int addtest(int a, int b);


addtest.h

int addtest(int a, int b);

 

addtest.c

#include"addtest.h"

int addtest(int a, int b)

{

 

        returna + b;

}

 

subtest.h

int subtest(int a, int b);


subtest.c

#include"subtest.h"

int subtest(int a, int b)

{

        intc = a - b;

        returnc;

}


multest.h

int multest(int a, int b);

 

multest.c

#include"multest.h"

int multest(int a, int b)

{

        intc = a*b;

        returnc;

}

Makefile书写如下:

 

# sample Makefile

#objects = addtest.o subtest.omultest.o

main:main.o addtest.o subtest.omultest.o

        gccmain.o addtest.o subtest.o multest.o -o main

main.o: addtest.h subtest.hmultest.h

#       gcc-c main.c

addtest.o: addtest.h

#       gcc-c addtest.c addtest.h

multest.o: multest.h

#       gcc-c multest.c multest.h

subtest.o:subtest.h

#       gcc-c subtest.c subtest.h

.PHONY: clean

clean:

        rmmain addtest.o subtest.o multest.o


注意:将以上文件放在同一个目录下,直接输入make命令就可以产生 subtest.o addtest.o multest.o main这四个文件,再输入./main 就可以得到结果。

在整个调试过程中可能会出现以下几个错误,现在列出来,希望对你有用:

(1)出现__gxx_personality_v0的错误。这是由于代码的源代码与后缀名不符合造成的。因为有时候我们是在visual下编写的程序,是以.cpp结尾的,当在linux下使用gcc编译时,就会出现这个错误。解决方法就是:将.cpp结尾的更改为.c结尾即可。

 (2)当出现'main' is up to date时(这儿的main是最终生成的文件,不是程序中main的 意思哦),说明文件没有改动,文件是最新的;而此时,我们还想再make应该如何做呢?解决方法:删除目录下.o文件  即 rm *.o.

 (3)当更改一个文件后,make仅仅执行更改的这个文件,其他并不执行,执行过程在make之后显示。

(4)重要提示: Makefile 可以理解为是gcc分步执行的一个汇总(这是我个人的理解),因为我们用gcc编译链接这个程序的过程如下:

编译过程

gcc -c addtest.c

gcc -c multest.c

gcc -c subtest.c

gcc -c main.c

链接过程

gcc main.o addtest.o subtest.o multest.o -o main

整个过程与Makefile中的过程是一致的。

当然这只是一种理解方式,Makefile的功能之强大又岂是gcc可比拟的。提供这种理解方式的目的就是告诉大家,当你用make操作的时候,总是出错的话,可以使用gcc分步执行,找到出错的地方。

相关内容