在使用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 <stdio.h>
#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 <stdio.h>
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:clean
clean:
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

[linux]makefile多目录的更多相关文章

  1. Linux Makefile多目录的编写

    手头一个项目,需要编写项目的makefile 多目录结构: csource/ ├── common│   └── sqlite3├── inc│   ├── curl│   ├── lua│   └─ ...

  2. 【转】Linux makefile 教程 非常详细,且易懂

    From: http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C ...

  3. Linux makefile 教程 非常详细,且易懂

    最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...

  4. Linux makefile 教程 非常详细,且易懂 (转)

    概述—— 什么是makefile?或许很多Winodws的程序员都不知道这 个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...

  5. Linux makefile 教程 非常详细,且易懂(转)

    转自:http://blog.chinaunix.net/uid-27717694-id-3696246.html 原文地址:Linux makefile 教程 非常详细,且易懂 作者:Deem_pa ...

  6. Linux Makefile文件编写详细步骤与实践

    Linux Makefile文件编写详细步骤与实践 1.makefile概述 Windows环境下IDE会帮你完成makefile文件的编写,但在UNIX环境下你就必须自己写makefile了,会不会 ...

  7. Linux Makefile 教程(转)

    原文地址:http://blog.csdn.net/liang13664759/article/details/1771246 ------------------------------------ ...

  8. Linux makefile 教程

    转自:http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指 ...

  9. Linux makefile 教程 非常详细,且易懂【转】

    转自:   http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C ...

随机推荐

  1. SpringBoot中的Tomcat是如何启动的?

    <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>s ...

  2. IntelliJ IDEA 2020.3正式发布,年度最后一个版本很讲武德

    仰不愧天,俯不愧人,内不愧心.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://ww ...

  3. PP-OCR论文翻译

    译者注: 我有逛豆瓣社区的习惯,因此不经意间会看到一些外文翻译成中文书的评价."书是好书,翻译太臭"."中文版别看"."有能力尽量看原版". ...

  4. 快速理解Python中使用百分号占位符的字符串格式化方法中%s和%r的输出内容的区别

    <Python中使用百分号占位符的字符串格式化方法中%s和%r的输出内容有何不同?>老猿介绍了二者的区别,为了快速理解,老猿在此使用另外一种方式补充说明一下: 1.使用%r是调用objec ...

  5. PyQt(Python+Qt)学习随笔:Qt Designer中toolBar的orientation属性和iconSize属性

    orientation属性 orientation属性用于确认工具栏是水平方向还是垂直方向,这个属性对于QMainWindow中的工具栏来说没有意义,因为QMainWindow中的工具栏支持在上下左右 ...

  6. js原生方法map实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 测试window安装的客户端

    1.win10 安装了客户端,测试一下,

  8. 【Jmeter 压测MySql连接问题】

    JDBC Request :Cannot load JDBC driver class 'com.mysql.jdbc.Driver'解决办法   在Jmeter中run JDBC Request时, ...

  9. java web简单的增删改查

    1.主要的文件,运行结果,运行界面,数据库创建的表等图片. 所要创建的文件和要导入的包: 主页面: 显示界面: 数据库的信息: 删除.查找.修改就不一 一列出来,自己可以运行看看.哈哈 2.接下来我将 ...

  10. Centos7.8安装Redis

    一.安装gcc依赖 由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装  [root@localhost local]# ...