[linux]makefile多目录
发布日期:2022-03-30 18:18:23 浏览次数:34 分类:博客文章

本文共 1490 字,大约阅读时间需要 4 分钟。

在使用makefile多目录编写前需要掌握几个函数及符号

自定义变量

target=edit

引用的时候直接使用 $(target)

有点像C语言中的#define,这里的 $(target)会被替换成edit.

也可以替换多个文件,注意空格

object=main.o xxx.o xxx.o

自动变量

自动变量是使用在第二行也就是gcc -c xxx

$< : 规则中的第一个依赖

$@:规则中的目标
$^: 规则中所有的依赖

$(target):$(obj)gcc \$^ -o \$@

这行代码的意思是规则中所有的依赖($^)(.o文件)生成目标($@)

$(target)

自动匹配

子规则中:

目标:依赖

%.o:%.c

自动匹配终极目标的依赖 :
main.o:main.c
add.o:add.c
sub.o:sub.c

makefile函数

pro=$(wildcard src/*.c)src=$(wildcard *.c)obj=$(patsubst %.c,%.o,$(pro) $(src))

wildcard 查找当前目录下和src目录下所有.c文件,分别返回给pro和src

pro=$(wildcard *.c)
src=$(wildcard src/*.c)
patsubst 替换所有.c文件为.o文件
obj=$(patsubst %.c,%.o,$(pro) $(src))

注意:

我在这里用空格将$(pro) $(src)分隔开,这样在编译的时候系统不会发生main.cxxx.c的情况,也就是头尾相连.

如此,前期准备工作就完成了.

代码实现

.├── main.c├── makefile└── src    ├── Speak.c    └── Speak.h

main.c

#include 
#include "src/Speak.h"int main(){ printf("Helo\n"); Speak(); return 0;}

src/Speak.c

#include "Speak.h"void Speak(void){printf("Speak\n");}

src/Speak.h

#include 
void Speak(void);

在这里开始解释makefile文件

pro=$(wildcard *.c)src=$(wildcard src/*.c)obj=$(patsubst %.c,%.o,$(pro) $(src))target=edit$(target):$(obj)	gcc $^ -o $@%.o:%.c	gcc -c $< -o $@.PHONY:cleanclean:	rm  $(obj) $(target) -f

我们将根目录下的.c文件(只有一个main.c)通过wildcard返回给pro

src目录下的.c文件通过wildcard返回给src

通过patsubst 替换所有.c文件为.o文件

然后通过自动匹配依赖

%.o:%.c	gcc -c $< -o $@

生成各个.c文件的.o文件

最终生成edit可执行文件

$(target):$(obj)	gcc $^ -o $@

整理:

  1. 利用wildcard返回各个目录下的.c文件,

  2. 利用patsubst将各个.c换成.o(这一步并没有生成.o文件,只是相当于将main.c返回为main.o)

  3. 利用自动匹配自动生成各个.o(这一步才是生成.o文件)

  4. 将所有的.o生成可执行文件edit

转载地址:https://www.cnblogs.com/cnleika/p/11422793.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:算法图解第一章_二分查找_python
下一篇:如何解决Renesas USB3.0RootHub警告

发表评论

最新留言

不错!
[***.144.177.141]2024年04月03日 05时44分24秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章