Makefile 练习(二):多个源文件

本文介绍了如何使用Makefile进行C语言项目的自动化构建,包括目标文件、依赖文件和自动化变量的使用。同时,通过示例展示了在不同目录下设置头文件搜索路径的方法,强调了-I选项的重要性以及vpath和VPATH的用法。
摘要由CSDN通过智能技术生成
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

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

la_fe_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值