目录结构:
----inc
|----hello.h
----src
|----hello.c
|----main.c
----bin
|----main
----obj
|----hello.o
|----main.o
----Makefile
要求:将hello.c和main.c编译成可执行文件man,放在bin目录下,目标文件放在obj目录下
hello.h文件内容如下
#ifndef _HELLO_H__
#define _HELLO_H__
void hello();
#endif
hello.c文件内容如下
#include<stdio.h>
#include"hello.h"
void hello()
{
printf("Hello world\n");
}
main.c文件内容如下
#include<stdio.h>
#include"hello.h"
int main()
{
hello();
return 0;
}
Makefile文件内容如下:
第一种方法:
VPATH=inc:src#vpath %.c src
#vpath %.h include
test:main.o hello.o
gcc -o $@ main.o hello.o
hello.o:hello.c hello.h
gcc -c $< -Iinc
main.o:main.c hello.h
gcc -c $< -Iinc
.PHONY:clean
clean:
rm test hello.o main.o
第二种方法:
DIR_INC = ./inc
DIR_SRC = ./src
DIR_OBJ = ./obj
DIR_BIN = ./bin
# wildcard 把指定目录./src下的所有后缀是.c的文件全部展开 SRC = ./src/1.c ./src/2.c
SRC = $(wildcard ${DIR_SRC}/*.c)
# patsubst 将./src下的所有后缀是c的文件全部该成./obj目录下的.o文件 OBJ = ./obj/1.o ./obj/2.o
OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC}))
TARGET = main
BIN_TARGET = ${DIR_BIN}/${TARGET}
CC = gcc
# -g gdb调试选项,-Wall 一些关键编译打印信息, -I./inc 让c文件的头文件包含路径到./inc目录下去找
CFLAGS = -g -Wall -I${DIR_INC}
${BIN_TARGET}:${OBJ}
# $@ 目标文件
$(CC) $(OBJ) -o $@
${DIR_OBJ}/%.o:${DIR_SRC}/%.c
# $< 源文件
$(CC) $(CFLAGS) -c $< -o $@
.PHONY:clean
clean:
find ${DIR_OBJ} -name *.o -exec rm -rf {} \;