Makefile工程管理

Posted little-kwy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile工程管理相关的知识,希望对你有一定的参考价值。

Makefile工程管理

前文回顾:gcc编译器

 

课程截图如下:

技术图片

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 

 

 

 

demo文件如下:

sequence.h

#ifndef _SEQUENCE_H_
#define _SEQUENCE_H_

void sequence(unsigned char*sp,unsigned char num);

#endif

sequence.c

#include "sequence.h"void sequence(unsigned  char *sp,unsigned char num)
{
    unsigned char i,j;
    unsigned char a;
    for(j=0;j<num-1;i++)
    {
        for(i=j+1;i<num;i++)
        {
            if(sp[j]>sp[i])
            {
                a=sp[i];
                sp[i]=sp[j];
                sp[j]=a;
            }
        }
    }     
}

main.c

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

unsigned char dis_num[8] = {10,9,17,92,2,8,35,12};

int main(void)
{
    unsigned char i;
    sequence(dis_num,sizeof(dis_num));
    for(i=0;i<8;i++)printf("%d ",dis_num[i]);
    printf("
");
    return 0;        
}

针对模块化程序如何去编译:

处理如下:

gcc -o sequence.o -c sequence.c
gcc -o main.o -c main.c
gcc -o main sequence.o main.o
./main

 

  假设 sequence.c 文件有修改了或者工程里面有很多的.c文件,按照上面的方式处理,工程量就很大,而且一旦有一个文件修改了,那么你就要重新再搞一遍。

  针对上面的情况,咋们就用 makefile 进行工程管理。

  • Makefile规则:

    1)先创建一个名称为 makefile 或者 Makefile 的文档;

    2)在文档里面输入相应的内容:

      输入相应内容的时候,要遵循相应的规则。 

      规则:用于说明如何生成一个或多个目标文件;
      规则格式:
           target:dependency_files                //目标项:依赖项
           <TAB>command                          //必须以tab开头,command编译命令

 

 

      规则就是为了生成某一个文件的。

 

      目标项:这个就是你要生成的文件名;

      依赖项:要生成目标项需要的文件;

      编译命令:如果有依赖项生成目标项;必须以TAB开头;

 

      makefile 文件里面可以有很多规则,但是第一个规则是最终生成的文件规则。

      编写规则如下:

      main:main.c
          gcc -o main main.c

 

    3)如何运行这个 makefile 文件

      make

 

main:main.o sequence.o
    gcc -o main main.o sequence.o

main.o:main.c
    gcc -o main.o -c main.c

sequence.o:sequence.c
    gcc -o sequence.o -c sequence.c

 

 

  • Makefile的伪目标:

    1)使用 .PHONY 这个makefile的关键字来定义你的伪目标;

.PHONY:clean rebuild

 

    2)再编写对应的伪目标:

clean:
    rm -f main.o main sequence.o

rebuild:clean main

 

    3)要想执行伪目标,直接  make 伪目标名就可以了。

make rebuild
make clean
  •  Makefile的变量:

    变量类似C语言里面的宏定义。

    变量分为:用户自定义变量,自动变量,预定义变量,环境变量;

    1)自定义变量:

      定义变量格式如下:

        变量名:=变量值

 

      如何引用变量:

        $(变量名)=???    //赋值
        ???=$(变量名)    //引用

      在 Makefine 体现如下:

SOURCE:=main.o sequence.o
EXE:=main

$(EXE):$(SOURCE)
    gcc -o $(EXE) $(SOURCE)

main.o:main.c
    gcc -o main.o -c main.c

sequence.o:sequence.c
    gcc -o sequence.o -c sequence.c

.PHONY:clean rebuild
clean:
    rm -f main.o main sequence.o

rebuild:clean main

 

 

 

    2)自动变量:

      使用的时候,使用特定的值去替换。

      自动变量,可以认为是 makefile 里面设定好的符号。

SOURCE:=main.o sequence.o
EXE:=main

$(EXE):$(SOURCE)
    gcc -o $@ $^

main.o:main.c
    gcc -o $@ -c $^

sequence.o:sequence.c
    gcc -o $@ -c $^

.PHONY:clean rebuild
clean:
    rm -f main.o main sequence.o

rebuild:clean main

 

    3)预定义变量:

 

 

    4)环境变量

 

以上是关于Makefile工程管理的主要内容,如果未能解决你的问题,请参考以下文章

Makefile

如何根据vs工程构建makefile文件

Makefile文件语法

使用带有 NMake 样式 Makefile 的 clang-cl 无法回显

C管理工具MakeFile

Makefile应用之Complicated工程