在使用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. Zookeeper(5)---分布式锁

    基于临时序号节点来实现分布式锁 为什么要用临时节点呢?如果拿到锁的服务宕机了,会话失效ZK自己也会删除掉临时的序号节点,这样也不会阻塞其他服务. 流程: 1.在一个持久节点下面创建临时的序号节点作为锁 ...

  2. PyQt(Python+Qt)学习随笔:QMainWindow的addDockWidget方法增加QDockWidget停靠窗到主窗口

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 DockWidget除了放在QMainWindow窗口内外,也可以放在 ...

  3. 第十二章、Designer中的menu菜单、toolBar工具栏和Action动作

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 Qt Designer中的部件栏并没有菜单.toolBar以及Action相关的部件,仅在 ...

  4. PostMan设置环境变量&全局变量

    一.设置环境变量 1.点击右上角Manage Environment,进入环境变量设置界面 2.定义环境名称,参数名及参数值 3.将接口地址中服务器地址进行参数化,并选择对应的环境执行 二.设置全局变 ...

  5. volatility内存取证学习

    工具下载: Linux环境 apt-get install volatility 各种依赖的安装,(视情况安装) #Distorm3:牛逼的反编译库 pip install distorm3 ​ #Y ...

  6. .Net Core ABP应用如何在阿里云Linux Docker中开启Https

    .Net Core应用开启Https本身就有很多种方式:1.代码配置2.环境变量3.反向代理 这里主要记录下阿里云的ECS,加阿里云免费的SSL证书,通过程序代码,如何进行配置. 首先从阿里云下载证书 ...

  7. 如何设置10px

    chrome浏览器小于12px字体默认显示12px? font-size:10px: -webkit-transform:scal(0.83):

  8. elastic-job分布式调度与zookeeper的简单应用

    一.对分布式调度的理解 调度->定时任务,分布式调度->在分布式集群环境下定时任务这件事 Elastic-job(当当⽹开源的分布式调度框架) 1 定时任务的场景 定时任务形式:每隔⼀定时 ...

  9. sqli-labs less8-10(布尔盲注时间盲注)

    less-8 布尔盲注 首先利用?id=1' and 1=1 --+和?id=1' and 1=2 --+确定id的类型为单引号''包裹.然后进行盲注. 盲注思路: 破解当前数据库名: and len ...

  10. unity入门—资源导入与场景创建

    前言: 从这一篇章开始,我将会通过游戏实例来讲解如何使用unity制作一个标准的游戏,介绍的内容较多,需要整理的东西也多可能中途会有一两天的咕咕咕,预计想要完成两个游戏,一个射击类一个塔防类,从射击类 ...