makefile

发布时间 2023-04-29 23:00:37作者: 不浪费时光

make

make是个命令,是个可执行程序,用来解析Makefile文件的命令

makefile

makefile 是个文件,这个文件中描述了咱们程序的编译规则

makefile语法规则

目标:依赖文件列表
<Tab>命令列表

make命令格式

make [ ‐f file ] [ targets ]

Makefile案例

sum.c

#include "head.h"
int sum(int a, int b) {
  return a + b;
}

sub.c

#include "head.h"
int sub(int a, int b) {
  return a ‐ b;
}

head.h

#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
int sum(int a, int b);
int sub(int a, int b);
#endif

Makefile

main:main.o sub.o sum.o
  gcc main.o sub.o sum.o ‐o main
main.o:main.c
  gcc ‐c main.c ‐o main.o
sub.o:sub.c
  gcc ‐c sub.c ‐o sub.o
sum.o:sum.c
  gcc ‐c sum.c ‐o sum.o
clean:
  rm *.o main a.out ‐rf

预定义变量

makefile中有许多预定义变量,这些变量具有特殊的含义,可在makefile中直接使用。

$@       目标名
$<       依赖文件列表中的第一个文件
$^       依赖文件列表中除去重复文件的部分
AR       归档维护程序的程序名,默认值为ar
ARFLAGS  归档维护程序的选项
AS       汇编程序的名称,默认值为as
ASFLAGS  汇编程序的选项
CC       C编译器的名称,默认值为cc
CFLAGS   C编译器的选项
CPP      C预编译器的名称,默认值为$(CC) -E
CPPFLAGS C预编译的选项
CXX      C++编译器的名称,默认值为g++
CXXFLAGS C++编译器的选项
CC=gcc
obj=main
obj1=sub
obj2=sum
OBJ=main.o sub.o sum.o
CFLAGS=‐Wall ‐g
$(obj):$(OBJ)
  $(CC) $^ ‐o $@

$(obj).o:$(obj).c
  $(CC) $(CFLAGS) ‐c $< ‐o $@
$(obj1).o:$(obj1).c
  $(CC) $(CFLAGS) ‐c $< ‐o $@
$(obj2).o:$(obj2).c
  $(CC) $(CFLAGS) ‐c $< ‐o $@
clean:
  rm *.o $(obj) a.out ‐rf

精简版

CC=gcc
obj=main
OBJ=main.o sub.o sum.o
CFLAGS=‐Wall ‐g
$(obj):$(OBJ)
  $(CC) $^ ‐o $@
%*.o:%*.c
  $(CC) $(CFLAGS) ‐c $< ‐o $@
clean:
  rm *.o $(obj) a.out ‐rf