首页 > 其他分享 >makefile学习

makefile学习

时间:2023-09-15 14:56:15浏览次数:31  
标签:gcc sub makefile 学习 SUBDIR test main

makefile

目标: 依赖文件
tab 命令
如果依赖文件比目标文件新,则执行命令来重新生成目标文件。

四个版本makefile对比

version 1:

test:main.c sub.c sub.h
	gcc -o test main.c sub.c

version 2: 优点:当只有一个文件更新时,不用重复编译

test:main.o sub.o
	gcc -o test main.o sub.o
main.o: main.c
	gcc -c -o main.o main.c
sub.o: sub.c
	gcc -c -o sub.o sub.c
clean:
	rm *.o test -f

version 3: 升级点:makefile文件简单一点

test:main.o sub.o
	gcc -o test main.o sub.o
%.o:%.c
	gcc -c -o $@ $<
clean:
	rm *.o test -f

version 4: 支持检测头文件(需要手工添加头文件规则)

test:main.o sub.o
	gcc -o test main.o sub.o
%.o:%.c
	gcc -c -o $@ $<
sub.o:sub.h
clean:
	rm *.o test -f

自动化变量

$@ : 目标文件

$^ : 所有依赖文件

$< : 第一个依赖文件

wildcard函数

$(function arguments)的写法用于函数调用。

$(wildcard *.c)

变量的赋值和修改

= : 递归赋值,最后赋值
:= : 简单赋值,直接赋值
+= : 文本添加,用于向已经定义好的变量中添加文本
?= : 条件赋值,用于第一次对该变量赋值

复杂场景的makefile

源文件和头文件按照功能或层级散落在一个个子文件夹下。

应对复杂的目录结构

简单的做法:使用wildcard匹配所有的源文件,把这些源文件一同添加到SRCS变量中。缺点:很难看出哪些路径得到了使用
gcc中 -I 指定头文件所在的路径

配置路径:将文件目录添加到工程文件配置中去。
foreach函数的使用:$(foreach var, list, text)

SUBDIR := .
SUBDIR += ./func

EXPANDED := $(foreach dir, $(SUBDIR), $(dir)/*.c)
SUBDIR :=.
SUBDIR += ./func

INCS := $(foreach dir, $(SUBDIR), -I$(dir))
SRCS := $(foreach dir, $(SUBDIR), $(wildcard $(dir)/*.c))

main: $SRCS
	gcc $(INCS) $(SRCS) -o main

makefile入门指南

标签:gcc,sub,makefile,学习,SUBDIR,test,main
From: https://www.cnblogs.com/yoy116/p/17705012.html

相关文章

  • 设计最近学习的课程接口
        ......
  • Vue源码学习(六):(支线)渲染函数中with(),call()的使用以及一些思考
    好家伙, 昨天,在学习vue源码的过程中,看到了这个玩意嘶,看不太懂,研究一下 1.上下文这段出现vue模板编译的虚拟node部分exportfunctionrenderMixin(Vue){Vue.prototype._c=function(){//创建标签returncreateElement(...arguments)......
  • 我的 Android 学习之路,一位 5 年中大厂的 Android 老哥跟你聊聊
    本文首发我的微信公众号:程序员徐公光阴似箭,日月如梭,时间真的过得飞快。加上实习,从事Android开发,差不多有5年了,在这里,我分享一下我的经验,在Android的学习路上,我是站在巨人的肩膀上成长起来的。大概分为三个部分一、Android职业规划二、Android学习路线三、如何进入大厂An......
  • HBase/Hadoop学习笔记 (转)
    HBase/Hadoop学习笔记  学习目标:至少掌握五点: 1.    深入理解HTable,掌握如何结合业务涉及高性能的HTable。 2.    掌握与HBase的交互,通过HBaseShell命令及JavaAPI进行数据的增删改查。 3.    掌握如何用MapReduce分析HBase里的数据 4.    掌握如何测试HB......
  • 20211326德永学习笔记2
    第九章总结要点1.I/O库函数与系统调用系统调用函数:open()、read()、write()、lseek()、close();I/O库函数:fopen()、fread()、fwrite()、flseek()、fclose()。I/O库函数一一对应地依赖于系统调用函数。2、I/O库函数的算法-2.1fread算法在第一次调用fread()时,FILE结构体的缓......
  • 软件测试|深入学习 Docker Logs
    简介Docker是一种流行的容器化技术,它能够帮助用户将应用程序及其依赖项打包成一个可移植的容器。Dockerlogs是Docker提供的用于管理容器日志的命令,本文将深入学习Dockerlogs的使用和管理,帮助用户更好地监测和解决容器问题。DockerLogs命令dockerlogs命令是Docker......
  • Python学习笔记-Python异常、模块与包
    了解异常什么是异常当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG。bug单词的诞生早期计算机采用大量继电器工作,马克二型计算机就是这样的。1945年9月9日,下午三点,马克二型计算机无法正常工作了,技术人员试......
  • C# ArrayPool学习
    ArrayPool是个数组缓冲池,可重复使用,避免频繁的创建和销毁数组,减少CG,提高性能byte[]data=newbyte[200];for(inti=0;i<data.Length;i++){data[i]=(byte)i;//模拟数据}vararrPool=ArrayPo......
  • 小麦苗GreenPlum学习大纲
    腾讯文档课程文档内容如下:小麦苗GreenPlum课程公开课--数据库通用学习路线、答疑、培训、考证等:https://docs.qq.com/doc/p/b65bcd7647a9974a94b97fb06d04a089c25a7f0c小麦苗GreenPlum课程第0节--数据库简介、分类、发展、流行度排名等:小麦苗GreenPlum课程第1节--PostgreSQ......
  • XSS学习之路
    alert():警告弹窗confirm():确定弹窗prompt():提示弹窗payload关键字测试:onfocus<script><ahref=javascript:alert()>'sRcDaTaOnFocusOnmOuseOverOnMouseDoWnP<sCriPt><ahReF=javascript:alert()>;&arg02="'sRcDaTaOnFocusOnmO......