[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 ...
随机推荐
- 从0开始带你成为JVM实战高手(百度网盘)
狸猫技术窝<从0开始带你成为JVM实战高手> 之前写过几篇 JVM 相关的文章,最近复盘的时候,发现狸猫技术窝<从0开始带你成为JVM实战高手>真的不错,然后就在网上找了一下( ...
- day1(初始化项目结构)
1.初始化项目结构 └─shiyanlou_project │ .gitignore │ README.en.md # 英文 │ README.md ...
- 从内存泄露、内存溢出和堆外内存,JVM优化参数配置参数
内存泄漏 内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费.内存泄漏最终会导致OOM. 造成内存泄漏 ...
- moviepy音视频剪辑:AudioClip帧处理时报TypeError: only size-1 arrays can be converted to Python scalar错
☞ ░ 前往老猿Python博文目录 ░ 一.环境 操作系统:win7 64位 moviepy:1.0.3 numpy:1.19.0 Python:3.7.2 二.应用代码及报错信息 程序代码 if ...
- 第二十七章、containers容器类部件QTabWidget选项窗部件详解
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...
- PyQt(Python+Qt)学习随笔:QTreeWidgetItem项子项展开相关方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件QTreeWidget中的QTreeWidgetItem项如果一个项有子项,可以调用setE ...
- PyQt(Python+Qt)学习随笔:QListWidget获取指定项对应行的row方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListWidget的row方法通过项作为参数,获取到对应项所在行的行号,语法如下: int ro ...
- Error.name 六种值对应的信息
1 EvalErroe:eval() 的使用与定义不一致 2 RangrError: 数值越界 3 ReferenceError:非法或不能识别的引用数值 4 SyntaxError:发生语法解析错 ...
- neo4j数据库数据转移,从阿里云转移到windows服务器
1.从阿里云迁移neo4j时需停掉neo4j数据库,在neo4j的bin目录下输入 ./neo4j stop 2.将数据备份到一个文件中 ./neo4j-admin dump --database=g ...
- uni与小程序,vue的区别
标签区别 uni使用小程序的标签,vue使用web端的标签 标签名变化的: 标签描述\类别 vue uniapp 文本 span\font text 链接 a navigator/ router-li ...