[linux]makefile多目录
在使用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 $@
整理:
利用
wildcard
返回各个目录下的.c文件,利用
patsubst
将各个.c换成.o(这一步并没有生成.o文件,只是相当于将main.c
返回为main.o
)利用自动匹配自动生成各个.o(这一步才是生成.o文件)
将所有的.o生成可执行文件edit
[linux]makefile多目录的更多相关文章
- Linux Makefile多目录的编写
手头一个项目,需要编写项目的makefile 多目录结构: csource/ ├── common│ └── sqlite3├── inc│ ├── curl│ ├── lua│ └─ ...
- 【转】Linux makefile 教程 非常详细,且易懂
From: http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C ...
- Linux makefile 教程 非常详细,且易懂
最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...
- Linux makefile 教程 非常详细,且易懂 (转)
概述—— 什么是makefile?或许很多Winodws的程序员都不知道这 个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...
- Linux makefile 教程 非常详细,且易懂(转)
转自:http://blog.chinaunix.net/uid-27717694-id-3696246.html 原文地址:Linux makefile 教程 非常详细,且易懂 作者:Deem_pa ...
- Linux Makefile文件编写详细步骤与实践
Linux Makefile文件编写详细步骤与实践 1.makefile概述 Windows环境下IDE会帮你完成makefile文件的编写,但在UNIX环境下你就必须自己写makefile了,会不会 ...
- Linux Makefile 教程(转)
原文地址:http://blog.csdn.net/liang13664759/article/details/1771246 ------------------------------------ ...
- Linux makefile 教程
转自:http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指 ...
- Linux makefile 教程 非常详细,且易懂【转】
转自: http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C ...
随机推荐
- Django----短信验证接口
1.注册荣联云账号 1.1注册账号 1.2 登录即可看到开发者账号信息 1.3 添加测试账号 2.使用容联云发送代码测试 '''1. 安装容联云sdk''' pip install ronglian_ ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- 排序--MergeSort 归并排序?
MergeSort 's implementation MergetSort 的中心思想就是分治思想,通过解决每一个小问题来解决大问题 假设你有2个已经排好序的数组 数组[ 4 ][ 8 ] 和 数组 ...
- Python中sort、sorted的cmp参数废弃之后使用cmp_to_key实现类似功能
Python2.1以前的排序比较方法只提供一个cmp比较函数参数,没有__lt__等6个富比较方法, Python 2.1引入了富比较方法,Python3.4之后作废了cmp参数.相应地从Python ...
- Python中自定义类未定义__lt__方法使用sort/sorted排序会怎么处理?
在<第8.23节 Python中使用sort/sorted排序与"富比较"方法的关系分析>中介绍了排序方法sort和函数sorted在没有提供key参数的情况下默认调用 ...
- 第15.11节 PyQt(Python+Qt)入门学习:Qt Designer(设计师)组件Property Editor(属性编辑)界面中主窗口QMainWindow类相关属性详解
概述 主窗口对象是在新建窗口对象时,选择main window类型的模板时创建的窗口对象,如图: 在属性编辑界面中,主窗口对象与QMainWindow相关的属性包括:iconSize.toolButt ...
- jarvisoj babyphp
jarvisoj babyphp 涉及知识点: (1)GitHack处理.git源码泄露 (2)php代码注入 解析: 进入题目界面. 看到题目中的用了git那么第一反应肯定是可能存在.git源码泄露 ...
- 当你在浏览器输入一个网址(如http://www.taobao.com),按回车之后发生了什么?
首先你输入了一个网址并按下了回车,这个时候浏览器会根据这个URL去查找其对应的IP,具体过程如下: 首先是查找浏览器缓存,浏览器会保存一段时间你之前访问过的一些网址的DNS信息,不同浏览器保存的时常不 ...
- 工作笔记——CPLD与MCU通过SPI通信
一.需求描述 MCU需要接收来自CPLD的升级固件数据 CPLD对MCU只进行发送数据,不接收MCU的数据 CPLD无法告知数据传输的开始和结束,需要MCU自行判断(CPLD只是数据透传,不做数据判断 ...
- gnuplot名词缩写
http://blog.163.com/yucheng_xiao/blog/static/7660019220141017114630822/ with 缩写成 w lt 是 linetype 的缩 ...