Makefile 编写

编写通用Makefile 近期在看韦东山的数码相框视频,有讲到怎么写一个通用的 阅读详情

0、前言

        由于项目中经常需要用到MakeFile的编写,但是有经常容易忘掉其中某些字符含义,因此特写出此Makefile博客,用来直接的参考而非对Makefile的详细讲解。

1、一个普通的Makefile脚本示例

# 这是一个简单的Makefile,没有使用变量及其它东西
# 生成文件名为main的可执行文件
# -lm 是连接数学库

main:cjsonmain.o cJSON.o
	gcc -o main cjsonmain.o cJSON.o -lm

main.o:cjsonmain.c cJSON.h 
	gcc -g -c cjsonmain.c

cJSON.o:cJSON.c cJSON.h
	gcc -g -c cJSON.c

clean:
	rm -rf *.o main

下面是我的工程目录图示

2、升级版的Makefile脚本示例

Makefile有三个非常有用的变量,其分别含义为:
(1) $@--目标文件;

(2)$^--所有的依赖文件;

(3)$<--第一个依赖文件;

# 这是一个makefile文档
# CC 		:指定编译器
# CFLAG 	:制定编译选项
# target 	:生成可执行应用的名字
# $(target) 	:此方法为引用target变量
# $@		:目标文件
# $^		:所有依赖文件
# $<		:第一个依赖文件

CC=gcc
CFLAG= -g
target=app

$(target):xxx.o aff.o
	$(CC) $(CFLAG) -o $@ $^

xxx.o:xxx.c aff.h
	$(CC) -c $< -o $@

aff.o:aff.c aff.h
	$(CC) -c $< -o $@

clean:
	rm -rf *.o $(target)

3、再升级版Makefile(完全使用通配符进行编写)

在下面所示Makefile编写中,源文件、头文件以及库等,直接添加进相应的变量中即可实现大型工程一键编译

COMPILE_COMPILER=

TARGET=app

CC = $(CROSS_COMPILER)gcc
LD = $(CROSS_COMPILER)gcc 
CPP = $(CROSS_COMPILER)g++

# 当前目录
DIR_PRJ:=$(shell pwd)
DIR_INC:=$(DIR_PRJ)/inc
DIR_SRC:=$(DIR_PRJ)/src
# *.h头文件
INCLUDE+=-I$(DIR_PRJ)/
INCLUDE+=-I$(DIR_INC)/
INCLUDE+=-I$(DIR_INC)/soap

# *.c源码
SRC:=$(wildcard $(DIR_PRJ)/*.c)
SRC+=$(wildcard $(DIR_SRC)/*.c)

# 编译flag
CFLAGS+=-g -I$(INCLUDE) 
CPPFLAGS+=-g -I$(INCLUDE) 

# 库
LIBS=-lpthread
LIBS+=
STATIC_OLIB+= 

# 链接flag
LDFLAGS+=-g -I$(INCLUDE) 

OBJS := $(SRC:.c=.o)
DEP := $(OBJS:.o=.d)

all: $(TARGET)

$(TARGET):$(SRC) $(OBJS)
	$(LD) $(LDFLAGS) $(OBJS) $(STATIC_OLIB) $(LIBS) -o $@

-include $(DEP)
%.o:%.c
	$(CC) $(INCLUDE) $(CFLAGS) -MM -MT $@ -MF $(patsubst %.o, %.d, $@) $<
	$(CC) $(INCLUDE) $(CFLAGS) -c $< -o $@
	
%.o:%.cpp
	$(CPP) $(INCLUDE) $(CPPFLAGS) -c $< -o $@
    
clean :
	rm -f $(TARGET) $(OBJS) $(DEP) *.o

4、 Makefile 编译动态库示例

        Makefile编译动态连接库,其实蛮简单的,把TARGET目标改一下名称,然后再编写选项中加上-fpic和链接输出时加上-shared即可,其它的不用动。

COMPILE_COMPILER=

TARGET=libIdReader.so

CC=$(CROSS_COMPILER)gcc
LD=$(CROSS_COMPILER)g++
CPP=$(CROSS_COMPILER)g++

# 配置目录
DIR_PRJ:=$(shell pwd)/../source/
DIR_SRC:=$(DIR_PRJ)

DIR_COMMON:=$(DIR_PRJ)/common

DIR_FAL:=$(DIR_PRJ)/fal

DIR_HAL:=$(DIR_PRJ)/hal

DIR_PAL:=$(DIR_PRJ)/pal

DIR_LIB:=$(DIR_PRJ)/libs
DIR_LIB_SYIDLIB:=$(DIR_LIB)/syidlib

# *.h头文件
INCLUDE+=-I$(DIR_PRJ)/
INCLUDE+=-I$(DIR_COMMON)/
INCLUDE+=-I$(DIR_FAL)/
INCLUDE+=-I$(DIR_HAL)/
INCLUDE+=-I$(DIR_PAL)/
INCLUDE+=-I$(DIR_LIB_SYIDLIB)/

# *.c源码
SRC:=$(wildcard $(DIR_PRJ)/*.c)
SRC+=$(wildcard $(DIR_COMMON)/*.c)
SRC+=$(wildcard $(DIR_FAL)/*.c)
SRC+=$(wildcard $(DIR_HAL)/*.c)
SRC+=$(wildcard $(DIR_PAL)/*.c)
SRC+=$(wildcard $(DIR_LIB_SYIDLIB)/*.c)

# 编译flag
CFLAGS+=-g -I$(INCLUDE) -std=gnu99 
CPPFLAGS+=-g -I$(INCLUDE)

# 库
LIBS=-lpthread -lm -lcurl -lidinfo
LIBS+=
STATIC_OLIB+= 

# 链接flag
LDFLAGS+=-g -I$(INCLUDE) -L$(DIR_LIB_SYIDLIB) -Wl,-rpath=${LD_LIBRARY_PATH}:$(DIR_LIB_SYIDLIB)

OBJS := $(SRC:.c=.o)
DEP := $(OBJS:.o=.d)

all: $(TARGET)

$(TARGET):$(SRC) $(OBJS)
	$(LD) $(LDFLAGS) $(OBJS) $(STATIC_OLIB) $(LIBS) -shared -o $@

-include $(DEP)
%.o:%.c
	$(CC) $(INCLUDE) $(CFLAGS) -MM -MT $@ -MF $(patsubst %.o, %.d, $@) $<
	$(CC) $(INCLUDE) $(CFLAGS) -c -fpic $< -o $@
	
%.o:%.cpp
	$(CPP) $(INCLUDE) $(CPPFLAGS) -c -fpic $< -o $@
    
clean :
	rm -f $(TARGET) $(OBJS) $(DEP) *.o

Makefile文件的编写(实例详解) 在实例中我通过工程中3个C文件,学习了Makefile中变量的使用,变量的赋值,特殊符号,通配符等等。并进行多文件的编写和改进,从而学习了Makefile的基础知识和理解如何编译和链接这几个文件。... 阅读详情

相关推荐

Makefile文件的编写

文章目录前言一、最简单的 Makefile 文件举例二、使用步骤1.引入库2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 Makefile文件的编写规则及内容 一、最.

weixin_43584401的博客 1817

Makefile编写——菜鸟杂谈

Makefile的编写

konomaww的博客 6242

从0开始教你编写Makefile文件

编写Makefile第一步,了解什么是Makefile?每当我们写大型项目时,一般需要很多源文件,源文件会在不同的目录中的文件夹里面包含着,这样我们所有的源文件不会在一个文件中包含,用gcc-omain所有的.c文件来编译,就很麻烦了,你需要记住所有的.c文件,那么为了方便编译链接,就此诞生。在学习Makefile之前,首先介绍一下make命令,make命令是GNU的工程化编译工具,它用于编译大量互相关联的源代码,使用它可以实现项目的工程化管理,提高开发效率。.obj.o.lib.a)。..........

oorik的博客 1万+

Linux Makefile 生成 *.d 依赖文件以及 gcc -M -MF -MP 等相关选项说明

1. 为什么要使用后缀名为 .d 的依赖文件? 在 Makefile 中, 我们的依赖关系可能需要包含一系列的头文件。 比如 main.c 源文件内容如下: #include &amp;amp;quot;stdio.h&amp;amp;quot; #include &amp;amp;quot;defs.h&amp;amp;quot; int main(int argc, char *argv[]) { printf(&a

专注于 IOT 物联网的嵌入式研发 3万+

图相似度模型(论文篇)

图相似度模型

weixin_43702653的博客 5748

利用pyGAM实现广义可加模型(GAM)的实战指南

本文提供了利用pyGAM库实现广义可加模型(GAM)的完整实战指南。通过乳腺癌和房价预测案例,详细讲解了从环境配置、模型构建、核心可视化(部分依赖图)到参数调优(n_splines, lam)的每一步。重点展示了GAM如何平衡模型准确性与可解释性,帮助数据科学家在Python中高效应用这一强大工具。

weixin_29053383的博客 329

通用Makefile模板

Makefile模块

Erice_s的博客 807

arcgis计算栅格平均值

打开FC栅格数据和非水体矢量数据 利用矢量数据提取对应栅格的非水体部分 2.1打开空间分析工具à提取分析à按掩膜提取 输入对应栅格数据和矢量数据 2.2提取结果如下 进行计算FC平均值 3.1打开空间分析工具à多元分析à波段集统计 输入对应栅格和输出路径 3.2统计结果如下 ...

Z_W_H_的博客 5371

Makefile编写

https://blog.youkuaiyun.com/Augusdi/article/details/7348375添加链接描述

weixin_43993117的博客 314

高速电路设计必看:同步开关噪声问题解析

数字电路中的同步开关噪声(SSN)问题日益突出,尤其是随着高速器件应用增多。本文分析了地弹和电压弹的产生机理,指出其与电源网络电感、输出驱动电流变化率密切相关。文章详细阐述了地弹参数特征,包括峰值电压、脉冲宽度等关键指标,并探讨了负载电容、信号压摆率等因素对地弹的影响。最后提出系统化的解决方案,涵盖芯片选型、电路设计、PCB布局和后期调试等多个环节,强调通过降低回路电感和控制电流变化率来有效抑制SSN。这些措施需要在性能、成本和复杂度之间取得平衡,为高速数字电路设计提供了重要参考。

一只豌豆象的博客 298

RNA-seq分析:Step4(比对)

预处理之后的fastq文件,可以使用HISAT2软件将reads比对至参考基因组上。HISAT2软件将reads比对至参考基因组上的步骤如下:1. 对参考基因组进行建索引。对参考基因组进行预处理,生成索引文件,包括基因组序列的FM索引和SA索引。2. 将原始的reads进行预处理。包括去除接头序列、去除低质量的碱基,以及进行过滤,得到质量较高的、可靠的reads。3. 利用建立的FM索引和SA索引,将处理后的reads与参考基因组进行比对。首先,通过FM索引,快速找到与reads匹配的可能位置;

沉香best的博客 2599

【Linux】————Makefile编写

1.一个冷知识:屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。正所谓:君子可内敛不可懦弱,面不公可起而论之。3.成年人的世界,只筛选,不教育。4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。

bhbcdxb123的博客 3583

MTK平台WiFi学习--Wi-Fi 连线/断线问题初步分析

摘要:本文详细介绍了MTK平台WiFi连接问题的日志分析方法。文章首先阐述了WiFi连接的标准流程,包括指令接收、BSSID选择、信道分配、认证关联、四次握手和DHCP获取等关键步骤。针对常见故障场景,如选网失败、信道申请失败、认证关联失败、四次握手失败等,提供了具体的日志分析方法和排查思路,包括识别关键日志、分析状态码、结合固件日志和抓包数据等。文章还特别强调了不同故障场景下需要收集的日志类型和分析要点,为WiFi连接问题的定位提供了一套系统化的解决方案。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1591

makefile编写规则

makefile编写规则 makefile的变量 # $@ 代表目标 # $^ 代表全部依赖 # $< 第一依赖 # $? 第一变化的依赖 makefile例子 #2020-8-3 # wildcard可以进行文件匹配 # patsubst 内容的替换 #makefile的变量 # $@ 代表目标 # $^ 代表全部依赖 # $< 第一依赖 # $? 第一变化的依赖 #get all .c files SrcFiles=$(wildcard *.c) #all .c files -

mirana的专栏 1万+

YOLO26涨点改进 | 细节涨点篇 | 源自SCI一区 | YOLO26引入HWD小波下采样模块,而不会显著增加计算开销,(适合小目标分割任务、小目标检测任务)

本文提出了一种基于Haar小波变换的下采样模块HWD,用于改进YOLO26目标检测性能。HWD模块通过小波变换降低特征图分辨率,同时将空间信息编码到通道维度,有效保留了关键信息。相比传统下采样方法,HWD能显著减少信息不确定性,提升小目标检测精度。实验表明,该模块可无缝集成到CNN架构中,不增加计算开销。文章详细介绍了HWD的实现原理、代码结构以及在YOLO26中的集成方法,并提供了两种改进版yaml配置文件。该创新模块已在多种数据集上验证有效,特别适合语义分割和目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 401

OpenMVS :用 colmap制作自己的数据集 重建(用colmap计算位姿,将位姿转为MVS需要的格式)

数据集制作主要是在windows进行,比较方便。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 3325

makefile编写速成

Makefile 是一种文件,它定义了软件项目中源代码文件的编译规则。很多Windows程序员可能对其不太熟悉,因为常见的Windows集成开发环境(IDE)通常会自动处理这些任务。然而,对于追求专业素养的程序员来说,理解Makefile是很有价值的,尤其是在Unix环境中,手动编写Makefile几乎是必备技能。能否编写Makefile在一定程度上反映了程序员是否有能力管理大型项目。

以实战经验介绍行业知识 2087

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Linux——makefile编写

Linux——makefile编写 阅读目录 关于makefile make怎么执行 makefile简化 Makefile还有什么 以前对makefile的编写,限于刚开始接触,我都比较局限一些死板的格式,有时候就会显得有些繁琐。在进一步了解一些系统编译和链接的知识后,对makefile编写流程有了一些新的认识,所以来此梳理梳理,方便更为灵活地编写makefile。 限于makefile认识不足,这里参考了一篇比较好博文:makefile 点击回顶部 关于makefile   m

songweiren1的博客 1680

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Linux 如何编写makefile详解

文章目录前言一、makefile三要素二、写法1.引入库2.读入数据总结 前言 Linux c/c++ 开发少不了编写 makefile 文件,一次编写,终身受益,哈哈!另外,gcc编译基础知识可参考我这篇博客:Linux C gcc编译基础知识详解 一、makefile三要素 目标: 依赖: 规则命令: 二、写法 目标:依赖 tab键 规则命名 先贴上我整个工程环境,如下所示: [lzy@localhost Calc]$ ls include lib src [lzy@localhost Cal

流云落尘 7002

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

编写makefile文件

makefile定义一系列规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译等。使用makefile自动化编译极大提高软件开发的效率。目标:依赖命令。

qq_45919531的博客 2758

makefile文件的编写

makefile文件 makefile的使用场景 makefile用于编译大量的.c文件 或者是分文件编写的(包含多个 .h 多个.c文件 和主文件 ) 将其转换为可执行文件 。 makefile的作用正是简化了上面的步骤,makefile的使用前提是掌握gcc 然后循序掌握其他内容 1 - 从简单的gcc 操作 到 转换为makefile 如我们要将 main.c 变为可执行文件 main 需要经历 gcc -E gcc -S gcc -C 当然对于单个.c文件转变为可执行文件 我们

C++ 是一门不原谅粗心的语言,而我恰好喜欢这种不原谅。 我是 x,正在成为更严谨的 C++ 开发工程师的路上。 1万+

【Makefile】简单的Makefile编写

Makefile编写 程序的编译和链接 使用C、C++编写可执行文件,首先要把源文件编译成中间代码文件,Linux下是.o文件,即Object File,这个动作叫做编译(complie)。 然后再把大量的Object File合成执行文件,这个动作叫链接(link)。 一个项目会拥有成百上千个源程序文件,再使用G++ or GCC会很麻烦。于是Makefile闪亮登场。 Makefile确定整个工程的编译规则,只需要一个make命令,就可以实现“自动化编译”。 make是一个解释Makefile

半生瓜のblog 3472

如何编写makefile

软件新人,在优快云上寻得一篇比较深入的关于编写makefile的文章,转载到本博客。 原博客地址:http://blog.youkuaiyun.com/haoel 如何编写makefile: 跟我一起写Makefile(一):http://blog.youkuaiyun.com/haoel/article/details/2886 跟我一起写Makefile(二):http://blog.csdn.n...

diansaopu0085的博客 120

【Makefile】Makefile编写规则

Makefile编写规则

目前从事C/C++开发,对Linux驱动开发、Qt应用开发、ROS开发方向感兴趣。 3318
上一篇: Linux ext4文件系统inode信息修改
下一篇: Linux 时间戳localtime函数多线程编程的一些坑
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值