linux - makefile

makefile

makefile文件定义了一系列的规则,makefile带来的好处就是"自动化编译",一旦写好,只需要make命令,整个工程即可完成自动编译;

基本规则

makefile基本规则如下:

目标:依赖
(tab) 命令

tab必须是tab键,否则报错

  • 目标:要生成的目标文件
  • 依赖:目标文件由哪些文件生成
  • 命令:gcc命令

第一个makefile

;makefile
main: main.c fun1.c
        gcc -o main main.c fun1.c
//fun1.c
#include <stdio.h>
int fun1(int argc,char* args[])
{
    
    
        int i = 0;
        for(;i < 10;i++)
        {
    
    
                printf("%d\n",i);
        }
        return 0;
}
//main.c
#include <stdio.h>
#include <stdlib.h>
#include "head.h"
int main(int argc,char* args[])
{
    
    
        fun1();
        return 0;
}

第二个makefile

main: main.o fun1.o
        gcc -o main main.o fun1.o
	
main.o: main.c				;生成main.o的规则	
        gcc -c main.c -I ./

fun1.o: fun1.c
        gcc -c fun1.c

变量

makefile使用变量类似于C语言中的宏定义,使用该变量相当于内容替换,使用变量可以使得makefile更加健壮;

普通变量

name=$fun1		;自定义变量
CC=gcc			;编译器
CPPFLAGS:C		;预处理选项 -I
CFLAGS:			;编译器选项-Wall -g -c
LDFLAGS:		;连接器选项 -L -l

自动变量

  • $@:标识规则中的目标
  • $<:标识规则中的第一个条件
  • $^:标识规则中的所有条件

第三个makefile

objfile=mainmain
CC=gcc
target=main
object=main.o fun1.o
CPPFLAGS=-I./
$(target): $(object)
        $(CC) -o $@ $^

main.o: main.c
        gcc -c $< $(CPPFLAGS)

fun1.o: fun1.c
        gcc -c $<

模式规则

至少在规则的目标中需要包含’%‘标识一个或多个,在依赖条件中同样使用’%’,依赖条件中的’%'的取值取决于其目标;

第四个makefile

objfile=mainmain
CC=gcc
target=main
object=main.o fun1.o
CPPFLAGS=-I./
$(target): $(object)
        $(CC) -o $@ $^
%.o:%.c
        gcc -c $< $(CPPFLAGS)                         

makefile函数

wildcard-	#查找指定目录下的指定的文件
	src=$(wildcard *.c)	#找到当前目录下所有后缀为.c的文件,赋值给src
patsubst-	#配置替换
	obj=$(patsubst %c,%o,$(src))	#把src变量里所有后缀为.c的文件替换为.o

第五个makefile

CC=gcc
target=main
CPPFLAGS=-I./
SRC=$(wildcard *.c)
objects=$(patsubst %.c,%.o,$(SRC))
$(target): $(objects)
        $(CC) -o $@ $^
%.o:%.c
        gcc -c $< $(CPPFLAGS)

makefile清理

第六个makefile

CC=gcc
target=main
CPPFLAGS=-I./
SRC=$(wildcard *.c)
objects=$(patsubst %.c,%.o,$(SRC))
$(target): $(objects)
        $(CC) -o $@ $^
%.o:%.c
        gcc -c $< $(CPPFLAGS)

.PHONY:clean
clean:
        rm -f $(objects) $(target)

以后我们只需要修改target的名称,即可在任何文件中使用makefile

猜你喜欢

转载自blog.csdn.net/weixin_43791961/article/details/110790530
今日推荐