1 位于同一目录下
list1.c
#include "list1.h"
#include <stdio.h>
void list1_printf()
{
printf("this is printf from list1\r\n");
}
list2.c
#include "list2.h"
#include <stdio.h>
void list2_printf()
{
printf("this is printf from list2\r\n");
}
main.c
#include "list1.h"
#include "list2.h"
#include <stdio.h>
int main()
{
printf("this is printf from main\r\n");
list1_printf();
list2_printf();
return 0;
}
list1.h
#ifndef __LIST1__
#define __LIST1__
void list1_printf();
#endif
list2.h
#ifndef __LIST2__
#define __LIST2__
void list2_printf();
#endif
Makefile
CC := gcc
TAR := main
OBJ := main.o list1.o list2.o
$(TAR):$(OBJ)
$(CC) -o $@ $^
main.o:main.c list1.h list2.h
$(CC) -c $<
list1.o:list1.c list1.h
$(CC) -c $<
list2.o:list2.c list2.h
$(CC) -c $<
.PHONY: clean
clean:
rm -f $(OBJ) $(TAR)
这部分增加了自动化变量$@ $^ $<的练习
$@:所有的目标文件,这里仅指代 main
$^: 所有的依赖文件,这里指代 main.o list1.o list2.o, 即 $(OBJ) 定义的内容
$<:依赖文件中的第一个,分别指代 list1.c 和 list2.c
2 位于不同目录下
inc 下包含 list1.h 和 list2.h
src 下包含 list1.c list2.c 和 main.c
Makefile 如下
PATH_SEL = y
ifneq ($(PATH_SEL),)
vpath %.c src
vpath %.h inc
else
VPATH = src inc
endif
OBJ = main.o list1.o list2.o
main:$(OBJ)
gcc -o $@ $(OBJ)
main.o:main.c list1.h list2.h
gcc -c $< -Iinc
list1.o:list1.c list1.h
gcc -c $< -Iinc
list2.o:list2.c list2.h
gcc -c $< -Iinc
.PHONY:clean
clean:
rm -f *.o main
这部分练习了文件搜索变量 VPATH 和 vpath
2.1 问题记录
调试过程中遇到的问题有
(1) 当指令中缺少 -Iinc 路径时,报错提示找不到 list1.h 和 list2.h
因此,不光要用VPATH或vpath指定搜索路径,还要再命令中添加头文件依赖的路径
main.o:main.c list1.h list2.h
gcc -c $<
(2) 未使用 $< 自动化变量时,报错提示找不到 main.c
main.o:main.c list1.h list2.h
gcc -c main.c -Iinc