一个通用的Makefile

一个比较通用的makefile CXX = g++ LIB = -L/data/protobuf/2.5.0_x64/lib/ INC = -I/data/protobuf/2.5.0_x64/include/ -I./ CXXFLAGS = -DSNACC_DEEP_COPY -DHAVE_VARIABLE_SIZED_AUTOMATIC_ARRAYS -Wno-deprecated -fPIC TARGET=main SRC=$(wildcard ./*.cpp) OBJ=$(patsubst %.cpp, %.o, $ 阅读详情

一、makefile的作用

Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中记录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动发现最终的生成文件已经过时,而应该重新编译相应的模块。 makefile带来的好处就是—“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。默认的情况下,make命令会在当前目录下按顺序找寻文件名为"GNUmakefile"、“makefile”、"Makefile"的文件,找到了解释这个文件。当然也可以使用make -f DIR/makefile 来指定用于makefile文件。

二、makefile语法简述

2.1 makefile规则

target ... : dependencies ... 
            command

target目标文件,可以是Object File,也可以是执行文件,还可以是一个标签 。
dependencies就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令,可以有若干行)。

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于dependencies中的文件,其生成规则定义在command中。dependencies 中如果有一个以上的文件时间要比target文件要新的话,command所定义的命令就会被执行。这就是 Makefile的规则。也就是Makefile中最核心的内容。在Makefile中的命令,必须要以[Tab]键开始。

2.2 变量定义

Makefile中变量的定义一般有两种: =和:=。 =符号定义的变量叫延时变量,只有在使用的时候才扩展开来; :=符号定义的变量为立即变量,一旦定义就扩展。 使用=定义的变量不能追加新值,使用:=定义的变量可以使用+=追加新值

2.3 文件指示

在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。include的语法是:include<filename>  filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)

2.4 伪目标

伪目标并不是一个文件,只是一个标签,由于伪目标不是文件,所以make无法生成它的依赖关系和决定 它是否要执行。我们只有通过显示地指明这个目标才能让其生效。当然,伪目标的取名不能和文件名重名,不然其就失去了伪目标的意义了。当然,为了避免和文件重名的这种情况,我们可以使用一个特殊的标记.PHONY来显示地指明一个目标是伪目标,向make说明,不管是否有这个文件,这个目标就是伪目标。

2.5 自动化变量

$<    第一个依赖文件的名称
$?    所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚
$@    目标的完整名称
$^    所有的依赖文件,以空格分开,不包含重复的依赖文件

三、通用的makefile实例

工程必备:

  • 顶层Makefile
  • 顶层Makefile.build
  • 子目录Makefile

编译过程:

从顶层开始递归进入子目录,当进入到一个目录的最底层时,开始使用GCC编译,再将该层的所有.o文件打包成build-in.o,返回它的上一层目录再递归进入子目录,当编译完所有的子目录后,就开始编译顶层的.c文件,最后将顶层的.o文件和顶层每个子目录的build-in.o链接成我们的目标文件

顶层Makefile解析(随工程而变):

#-------------------------指定编译工具链-------------------------
CROSS_COMPILE =                         #指定编译器种类

AS        = $(CROSS_COMPILE)as          
LD        = $(CROSS_COMPILE)ld          #链接工具
CC        = $(CROSS_COMPILE)gcc         #编译工具
CPP       = $(CC) -E                    
AR        = $(CROSS_COMPILE)ar          #打包工具
NM        = $(CROSS_COMPILE)nm          

STRIP     = $(CROSS_COMPILE)strip    	#优化工具
OBJCOPY   = $(CROSS_COMPILE)objcopy  	
OBJDUMP   = $(CROSS_COMPILE)objdump  	

export AS LD CC CPP AR NM               #将定义的变量导出,方便其他makefile使用
export STRIP OBJCOPY OBJDUMP            #将定义的变量导出,方便其他makefile使用

CFLAGS := -Wall -O2 -g                  #编译器参数
CFLAGS += -I $(shell pwd)/include       #指定编译器头文件(根据实际项目手动修改)
LDFLAGS := -lm -lfreetype -lvga         #指定编译器链接库(根据实际项目手动修改)
export CFLAGS LDFLAGS                   #将定义的变量导出,方便其他makefile使用
TOPDIR := $(shell pwd)                  #获得当前程序的顶层目录

export TOPDIR                           #输出顶层目录
TARGET := show_file                     #编译后的程序名(根据实际项目手动修改)

#--------------顶层要生成的.o文件以及顶层文件夹(根据实际项目手动修改)--------------
obj-y += main.o
obj-y += display/
obj-y += draw/
obj-y += encoding/
obj-y += fonts/

#----------------------------顶层的第一个规则(默认规则)--------------------------
all :
    make -C ./ -f $(TOPDIR)/Makefile.build      #进入当前目录,使用顶层的makefile.build进行编译
    $(CC) $(LDFLAGS) -o $(TARGET) built-in.o    #将编译好的built-in.o文件链接生成我们的目标文件

#---------------------------------顶层的清除规则-------------------------------
clean:
    rm -f $(shell find -name "*.o")       #删除所有的.o文件
	rm -f $(shell find -name "*.d")       #删除所有的.d文件
    rm -f $(TARGET)                       #删除目标文件
.PHONY:all clean

顶层Makefile.build解析(无需改动):

PHONY := __build        #定义一个PHONY变量
__build:                #开头说明__build伪目标,使其成为Makefile.build的第一个目标
obj-y :=                #定义当前目录的目标变量,初始值为空
subdir-y :=             #定义当前目录的子目录变量,初始值为空
include Makefile        #将当前目录的Makefile包含进来,初始化obj-y
                        #obj-y:=a.o b.o c/ d/
__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y)))    #筛选出当前目录的目标变量中的子目录,并且去掉/
							 						  	 #$(filter %/, $(obj-y)):c/ d/
							 							 #__subdir-y:c d
subdir-y += $(__subdir-y)				 				 #将开始定义的subdir-y赋值为__subdir-y
							 							 #subdir-y:c d
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)  #对于subdir-y里面的每一个值(目录),增加一个相应的目录/built-in.o的变量值
							 							 #subdir_objs:c/built-in.o d/built-in.o
cur_objs := $(filter-out %/, $(obj-y))     		 		 #得到obj-y中的.o文件
							 							 #cur_objs:a.o b.o
dep_files := $(foreach f,$(cur_objs),.$(f).d)     		 #对于所有的.o文件,定义它的依赖文件名
							 							 #dep_files: .a.d .b.d
dep_files := $(wildcard $(dep_files))

ifneq ($(dep_files),)          #根据依赖文件名,判断依赖文件是否存在,存在就包含就来
    include $(dep_files)
endif

PHONY += $(subdir-y) 		   #将$(subdir-y)也加入到变量PHONY中

#------------------------Makefile. build的第一个规则-------------------------
__build : $(subdir-y) built-in.o			#第一个规则
$(subdir-y):                                #第一个规则的第一个依赖规则
    make -C $@ -f $(TOPDIR)/Makefile.build  #依次进入该子目录变量里面存储的值,使用的Makefile.build进行编译
built-in.o : $(cur_objs) $(subdir_objs)     #第一个规则的第二个依赖规则
      $(LD) -r -o $@ $^                     #该规则的命令:将该目录下的.o和$(subdir_obj)打包成built-in.o文件
dep_file = .$@.d                            
%.o : %.c                                   	 #第一个规则的第二个依赖规则的依赖规则 
$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<  #用于将目录下所有的.c文件编译成.o文件
.PHONY : $(PHONY)                           	 #将PHONY声明为伪目标

子目录Makefile(随工程而变):

子目录的Makefile就是包含该目录下所有的目标文件名和子目录文件夹名。

例如任何一个子目录可写成:

objs-y := a.o
objs-y += b.o
objs-y += c/
objs-y += d/

转载地址: http://www.cnblogs.com/lidabo/p/4521123.html

手把手教你使用YOLOv11模型,训练自己数据集,百分百成功(无废话) YOLOV11百分百成功训练自己的数据集并进行图像、视频流脚本预测 阅读详情

相关推荐

汽车轮胎动平衡背后的秘密:如何用惯性主轴原理消除方向盘抖动

本文深入解析了汽车轮胎动平衡的核心原理,即利用惯性主轴原理消除高速行驶时的方向盘抖动。文章从方向盘抖动的现象出发,阐释了动不平衡产生的物理本质,并详细介绍了如何通过动平衡机测量、计算与校正,使轮胎-轮毂系统的实际旋转轴回归其惯性主轴,从而实现稳定运转。

grafana6viz的博客 347

通用makefile

文章目录1 最基本的makefile1.1 简单粗暴的makefile1.2 稍微提高效率的makefile1.3 更加精炼的makefile1.4 需要手工添加头文件规则的makefile1.5 支持自动检测头文件的makefile1.6 支持自动获取目标文件的makefile 1 最基本的makefile 有main.c、sub.c、sub.h三个文件,文件内容如下: main.c: #inc...

木子皿--啥都不会的菜鸟 1340

从Level 1到Level 22:手把手带你用Burp Suite通关burp-labs靶场全关卡(附难点解析)

本文详细解析了如何使用Burp Suite通关burp-labs靶场的22个关卡,从基础爆破到复杂编码绕过,涵盖Intruder配置、响应过滤、POST请求处理、MD5爆破等关键技术。特别针对Level 16的三重编码和Level 20的中文响应处理等难点提供实战技巧,帮助渗透测试工程师提升Web安全实战能力。

weixin_28831461的博客 436

一个通用的Makefile写法

makefile的一种写法

远方客的专栏 722

FFmpeg硬件加速实战:VAAPI驱动配置全攻略(含NVIDIA/Intel避坑指南)

本文详细解析了在Linux环境下配置FFmpeg使用VAAPI接口实现硬件加速的完整流程。针对NVIDIA、Intel等主流显卡,提供了从驱动安装、环境变量设置到多显卡切换的实战指南,并重点解决了闭源驱动冲突、国产系统适配等常见问题,帮助用户有效提升视频处理性能。

weixin_29306011的博客 456

C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

Muduo is a multithreaded C++ network library based on the reactor pattern. muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。 muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码...

大秦坑王的专栏 3万+

makefile的作用是什么?

作用:管理工程文件,通过makefile的编写,对工程下不同目录中的文件的编译、链接的方式、顺序进行描述。 在编写makefile后,编译工程只要求输入make命令,极大的提高了编译效率。

ZWHCYY001的博客 3451

离线安装 nvidia-docker2(nvidia-container-toolkit)

很多时候大家都有用docker使用gpu的需求,但是因为网络等原因不是那么好用,这里留了一个给ubuntu的安装包,网络好的话也提供了在线安装方式。

father_yingying的博客 1181

跟我一起写 Makefile(三)

Makefile 总述———————一、Makefile里有什么?Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书

陈皓专栏 【空谷幽兰,心如皓月】 10万+

Dr_can Kalman Filter学习笔记(一)

本文是在b站Dr_can的卡尔曼滤波课程学习过程中的学习笔记

苏大侠的博客 1051

【批处理脚本】-0.1-如何运行批处理bat文件

如何运行批处理bat文件

「汽车电子助手」的博客 1586

关于 Makefile, 该知道这些

一 Makefile 的用途 (1)可用做于管理工程文件的工具 (2)make 是解释Makefile的解释命令工具 (3)可以提高工作效率,减少出错的几率。 二 基本规则 2.1 目标:依赖 (tab)命令 目标 --> 要生成的目标文件。(关于伪目标,请看最后补充说明。) 依赖 --> 生成目标文件需要的一些文件。 命令 --> 借助依赖文件生成目标文件的手段。忽略错误命令继续执行,不显示执行时候的命令细节。tab --> 缩进,有且只有...

那么菜的博客 2165

时空智友企业流程化管控系统文件上传漏洞

时空智友企业流程化管控系统是一个功能丰富、灵活可定制的企业管理工具。通过该系统,企业能够实现流程的自动化、协同的提升、数据的洞察和决策的优化,从而提高工作效率、管理水平和企业竞争力。时空智友企业流程化管控系统 formservice接口处存在任意文件上传漏洞,未经认证的攻击者可通过此接口上传后门文件,最终可导致服务器失陷。

holyxp的博客 1032

一个通用的makefile文件应该怎么写

目标文件名为demo#没有去掉符号表和调试信息的目标文件版本#map文件包含目标文件链接阶段的细节内容,通常包含全局符号,交叉引用和内存映射等信息#交叉编译工具链#C语言编译工具gcc#C++编译工具g++#GNU中用来将目标文件打包为静态链接库的工具#GNU链接器,用来将目标文件与库链接为可执行文件#GNU中的用来裁剪调试信息与符号表的工具#GNU中AR的子工具,用来为归档文件创建符号表索引,符号表文件可以让链#接器快速查找函数符号在相应对应文件的位置。

qq_40854508的博客 1161

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

一个通用的makefile

我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c的源文 件。 如果我们用gcc去一个一个编译每一个源文件的话,效率会低很多,但是如果我们可以写一个Makefile,那么只需要执行一个make就OK了,这 样大大提高了开发效率。 但是Makefile的语法规则众多,而且缺乏参考资料,对于初学者来说,写起来还是有一定的难度,往往令很多人

kesaihao862的专栏 914

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一个通用Makefile

############################################################### # # # 通用Makefile # # 需要定义好程序文件、目标文件、编译选项 # # ############################################################### # i586-mingw32msvc-gcc ...

爱自在的专栏 193

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

一个通用makefile的编写

linux编译多个源文件的程序比较麻烦,这下就需要通用的Makefile了,编译的时候执行一下make命令就OK,下面介绍通用makfile的写法。 假设现在有以下源文件:file1.h file1.c file2.h file2.c mainproc.c,程序的主函数在mainproc.c中。 #######通用Makefile模板######## # 目标文件名字 TARGET = Mypro

gl23838的专栏 563

一个跨平台通用的Makefile文件

这是一个跨平台的Makefile项目,支持C/C++混合编译、动态/静态库生成、交叉编译等功能。项目特点包括:单一Makefile文件实现简洁管理;支持Linux/Windows平台(Windows需Busybox);提供丰富的配置选项,如编译类型(Release/Debug)、目标文件位置等;内置错误检查和学习文档。通过脚本可灵活配置参数,适合企业开发和学习Makefile使用。项目开源,遵循MIT许可证。

qq_31340093的博客 1123

一个通用makefile文件

有没有一个比较通用的makefile呢? 写在前面: 这个通用mkaefile文档,来源于正电原子学习板中提到的一种,当然这不代表这个就是最合适的,这只是我在学习过程中遇到的文档中,觉得最厉害的一个。 重点还是以学习为主,学学一般的makefile文件是怎么写的,以及makefile的基础知识。 上代码:(上接我写那个bsp推文) 项目源:Linux驱动开发: Makefile+driver可直接下载其中的5_ledc_bsp,都是整理好的。 CROSS_COMPILE ?= arm-l.

小胡同学的工程师学习之路 390

一个通用Makefile模板

最近学习Makefile,写了一个C++编译的通用Makefile模板 它能做什么: 1. 能编译出应用程序,静态库,动态库 2. 可以用在任意目录结构的工程 3. 可以指定多个源文件后缀 4. 可以指定源文件的排除目录和排除文件列表 5. 已经充分考虑了源文件与头文件的依赖关系 6. 使用简单,只需要修改USER-DEFINED SECTION中的几个参数 执行流程:

2042

一个比较通用的Makefile

一个比较通用的Makefile TARGET = xxxSRCDIRS = .SRCEXTS := .c .cppSRC = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))OBJ = $(foreach x,$(SRCEXTS), $(patsubst %$(x),%.o,$(filter %$...

afdd28617的博客 122

一个较通用的makefile

########################################################## #This is a common makefile templet #By WSL 2018-07-26 ########################################################## CROSS = CC = $(CROSS) gcc ...

Lasuerte的博客 402
上一篇: 嵌入式Linux--解决编译buildroot出错
下一篇: bmp文件头信息
奔向星辰花海
博客等级 码龄10年 113粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值