Linux Makefile

1.开发背景

        linux 下编译程序需要用到对应的 Makefile,用于编译应用程序。

2.开发需求

        编写 Makefile 编译应用程序

        1)支持多个源文件

        2)支持多个头文件

        3)支持只编译修改的文件,包括源文件和头文件

        4)支持交叉编译

3.开发环境

        ubuntu 20.04

4.实现步骤

4.1 准备源码文件

准备了一个串口通讯的 app 程序,其中包括 2 个头文件和 3 个源文件,当然还是少不了 Makefile文件,如下图所示:

4.2 编写 Makefile

# 定义目标文件名
TARGET := app_uart# 关键路径 ##############################################
INC_DIR = ./inc
INC_DIR_COM = ../../00_com/inc
SRC_DIR = . ./src ${SRC_DIR_COM}
SRC_DIR_COM = ../../00_com/src
OBJ_DIR = ./obj
TAR_DIR = ./install# 定义编译器和编译选项 ###################################
CC := aarch64-linux-gnu-gcc
CFLAGS := 
# CFLAGS += -fPIC # 生成动态库
# CFLAGS += -O2 # 优化等级
CFLAGS += -Wall # 显示警告
CFLAGS += -Werror # 显示错误
CFLAGS += -I${INC_DIR} # 添加.h路径
CFLAGS += -I${INC_DIR_COM} # 添加.h路径
CFLAGS += -lpthread # 多线程编译
# CFLAGS += -DNDEBUG # 关闭断言# 定义源文件和目标文件 srcs:*.c 遍历添加
SRCS := $(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.c))
SRCS_FILE = $(notdir $(SRCS))	# 去除路径,剩下文件名OBJS := $(SRCS:.c=.o)
# OBJS := $(patsubst %.c, $(OBJ_DIR)/%.o, $(SRCS_FILE))
MMDS := $(OBJS:.o=.d)# IP 地址 和 路径
IP_ADDRESS := 172.16.0.188
IP_PATH := /home/linaro/auto_start# 默认目标 $< 表示第一个依赖 $@ 目标文件
app: $(TARGET)
# -MMD 生成 *.d 文件 记录 .o 文件对 .c 和 .h 文件的依赖 
-include ${MMDS} # -include 带 - 前缀第一次编译不会出错
%.o: %.c  
# $(OBJ_DIR)/%.o: %.c $(CC) $(CFLAGS) $< -c -MMD -o $@	# 生成可执行文件
$(TARGET): $(OBJS) $(CC) $(CFLAGS) $^ -o $@
#	mv ${OBJS} ${OBJ_DIR}
#	mv ${MMDS} ${OBJ_DIR}# if 判断需要顶格编写 如果不存在路径则创建
ifeq ($(wildcard ${TAR_DIR}), )mkdir ${TAR_DIR}
endifmv ${TARGET} ${TAR_DIR}/${TARGET}# 清理生成的文件
clean:rm -f $(OBJS) ${MMDS} $(TARGET) ${OBJ_DIR}/*
ifneq ($(wildcard ${TAR_DIR}/*), )rm ${TAR_DIR}/*
endifprebuild:
# if 判断需要顶格编写 如果不存在路径则创建
ifeq ($(wildcard ${OBJ_DIR}), )mkdir ${OBJ_DIR}
endif
#	-cp ${INC_DIR_COM}/*.h ${INC_DIR}
#	-cp ${SRC_DIR_COM}/*.c ${SRC_DIR}all:make prebuildmake rebuild:make cleanmake # 打包文件
pack:make clean# 发送文件  需要先手动连接一次
scp:sshpass -p root scp ${TAR_DIR}/${TARGET} linaro@${IP_ADDRESS}:${IP_PATH} test:$(warning $(SRC_DIR))$(warning $(SRCS))$(warning $(SRCS_FILE))$(warning $(OBJS))$(warning $(OBJ_DIR)/%.o)

4.3 编译程序

其中,使用了交叉编译工具:aarch64-linux-gnu-gcc,编译生成的文件移动到 install,方便查看,需要注意的是这里指定了多个源文件和头文件路径。

4.4 修改文件重新编译

其中只修改了 main.c 文件,所以重新编译 main.c 文件

4.5 主要修改点

4.5.1 头文件修改重新编译

如果只是一般操作,Makefile 在.o文件存在的情况下是不会重新编译的,这就意味着一般的修改.h 文件不会重新编译.c文件的。

解决方法:使用 -MMD 编译生成中间链接关系文件,再调用-include,带前缀‘-’,否者 第一次编译会报没有.d文件。

-include $(OBJS:.o=.d)  
%.o: %.c    $(CC) $(CFLAGS) $< -c -MMD -o $@  

5. 参考链接

Makefile-只修改了.h头文件,编译为什么不起作用? - 码农教程

makefile一般格式,自动更新头文件_makefile头文件更新-CSDN博客

Makefile编译目录下多个文件以及函数wildcard用法_src=$(wildcard *.cpp)-CSDN博客

多目录时Makefile 的编写方法_makefile中一个变量对应了多个绝对路径-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android10以上MediaProjection截屏

起因 在系统升级到Android10以上之后&#xff0c;之前的截屏方式不能用了&#xff0c;而且必须将MediaProjection放在forground service里面跑才行。网上搜了一圈&#xff0c;都是语焉不详或者没有完整的一个代码应用。只能自己写一个&#xff0c;记录下 代码实现 新建一个S…

Web程序设计-实验03 JavaScript语言基础

题目 【实验主题】 素数问题求解。计算&#xff08;判断&#xff09; 1~100中哪些是素数、哪些是合数。 素数也称为质数&#xff0c;是只能被1及其自身整除的自然数。与素数相对应的是合数&#xff0c;合数可以被分解为若干个素数的乘积&#xff0c;这些素数称为这个合数的质…

分布式爬虫之Scrapy

[官方文档]&#xff08;https://docs.scrapy.org/en/latest/topics/item-pipeline.html&#xff09; Scrapy 的可以做的事情 Scrapy 是一个功能强大的开源网络爬虫框架&#xff0c;它可以用于从网页或其他源中提取数据。以下是 Scrapy 可以执行的一些常见任务&#xff1a; 网…

五个关于CSS3的常见面试题

CSS3面试题 1. CSS3中的渐变&#xff08;Gradient&#xff09;是什么&#xff1f;请举例说明其用法。 答案&#xff1a;CSS3中的渐变是一种可以在元素背景、边框或文本中创建平滑过渡效果的技术。主要有线性渐变&#xff08;linear-gradient&#xff09;和径向渐变&#xff0…

阿里云服务器多队列性能参数

阿里云服务器“多队列”是什么意思&#xff1f;多队列是指主网卡支持的最大网卡队列数。除弹性裸金属服务器实例规格外&#xff0c;辅助网卡支持的最大网卡队列数与主网卡一致。 阿里云服务器ECS规格和CPU内存配置不同&#xff0c;网卡支持的多队列性能参数值也不同&#xff0…

数据结构从入门到实战——顺序表的应用

目录 一、基于动态顺序表实现通讯录 二、代码实现 2.1 通讯录的初始化 2.2 通讯录的销毁 2.3 通讯录的展示 2.4 通讯录添加联系人信息 2.5 通讯录删除联系人信息 2.6 通讯录修改联系人信息 2.7 通讯录的查找联系人信息 2.8 将通讯录中联系人信息保存到文件中 2.9…

SpringBoot整合通用Mapper

pom引入依赖&#xff1a; <dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.1.5</version></dependency><dependency><groupId>tk.mybatis</groupI…

【Windows10】Anaconda3安装+pytorch+tensorflow+pycharm

文章目录 一、下载anaconda0.双击下载的文件1. 选择All users2. 安装路径3. 勾选环境变量和安装python4.安装完成5.添加环境变量6.测试是否安装成功 二、安装pytorch&#xff08;先看四&#xff01;先检查一下自己电脑是不是只能安装GPU版的1.查看conda图形化界面2.在安装pytor…

【图解计算机网络】网络协议分层解析

网络协议分层解析 网络协议分层应用层传输层网络层数据链路层 TCP/IP分层模型通讯示例 网络协议分层 网络协议分层一共有OSI七层网络协议&#xff0c;TCP/IP四层网络网络协议&#xff0c;还有五层网络协议。 七层由于分层太多过于复杂&#xff0c;实际应用中并没有使用&#x…

代码编辑工具PilotEditPro18.4版本在Windows系统的下载与安装配置

目录 前言一、PilotEdit Pro安装二、使用配置总结 前言 “ PilotEdit Pro是一个功能强大且功能丰富的文本和代码编辑器&#xff0c;可满足程序员、开发人员和IT专业人员的不同需求。定位为一个多功能的编辑解决方案&#xff0c;PilotEdit Pro以其对广泛的文本和代码文件格式的…

Nginx莫名奇妙返回了404

描述 nginx作为反向代理&#xff0c;代理python的服务&#xff0c;但是通过代理访问服务的时候&#xff0c;报了404的错误。 难受的是客户现场没有查看日志的权限&#xff0c;只有查看配置文件的权限&#xff0c;我们检测了几遍配置文件也没有找到问题&#xff0c;哎~ 问题引…

Node.js安装和配置

第一步&#xff1a;安装Node.js 首先&#xff0c;我们需要安装Node.js。请按照以下步骤进行操作&#xff1a; 步骤一&#xff1a;访问Node.js官方网站 打开你喜欢的浏览器&#xff0c;访问Node.js官方网站&#xff1a;https://nodejs.org 步骤二&#xff1a;下载Node.js安装…

相机摄影入门技巧,数码摄影技巧大全

一、资料前言 本套数码相机摄影资料&#xff0c;大小1.08G&#xff0c;共有42个文件。 二、资料目录 《aking人像摄影技巧分享》.pdf 《Nikon.D90数码单反摄影技巧大全》FUN视觉.全彩版.pdf 《不可不学的摄影技巧》.pdf 《常用场景摄影》.pdf 《单反数码摄影专家技法》.…

【Web】AFCTF 2021 题解(部分)

目录 BABY_CSP search secret google authenticator 随便做做&#xff0c;环境是NSS上的 BABY_CSP CSP绕过_script-src self-CSDN博客 CSP指令值 *&#xff1a; 星号表示允许任何URL资源&#xff0c;没有限制&#xff1b; self&#xff1a; 表示仅允许来自同源&#xff…

盲人购物指南:智能化辅助引领超市购物新体验

作为一名资深记者&#xff0c;我有幸见证了一位盲人朋友借助一款名为蝙蝠避障的高科技辅助应用&#xff0c;独立完成超市购物之旅&#xff0c;这一过程充分展示了盲人购物指南新时代的到来。 在前往超市的路上&#xff0c;这款应用犹如一位贴心的“电子向导”&#xff0c;实时为…

Android Room 记录一个Update语句不生效的问题解决记录

代码展示 1.数据实体类 Entity public class User {PrimaryKey(autoGenerate true)private long id;private String name;private String age;private String sex;public User(String name, String age, String sex) {this.name name;this.age age;this.sex sex;}public …

【剪映专业版】14为视频添加炫酷特效

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 1.特效 画面特效&#xff1a;用于整个画面 人物特效&#xff1a;仅用于画面中的人物&#xff0c;如画面中无人&#xff0c;则不起作用 2.添加特效 按号添加 可通过鼠标推动实现特效时间调节 可叠加使用特效 3.特效修…

危险场景智能运维巡检系统

在石油、天然气、煤炭和化工等行业&#xff0c;特别是在I/IIC级防爆区场景中&#xff0c;存在着诸如易燃、易爆、高温、有毒有害以及粉尘等危险因素。例如&#xff0c;油气转运站、催化裂化装置、煤化工甲醇车间以及制氢站等地点&#xff0c;都面临着这些潜在的危险。传统的人工…

34. 【Android教程】菜单:Menu

作为 Android 用户&#xff0c;你一定见过类似这样的页面&#xff1a; 它就是我们今天的主角——菜单&#xff0c;它的使用场景和作用不用多说&#xff0c;几乎每个 App 都会用到它&#xff0c;今天我们就一起来看看 Android 提供的几种菜单类型及用法。 1. 菜单的几种类型 根…

【小贪】大数据处理:Pyspark, Pandas对比及常用语法

近期致力于总结科研或者工作中用到的主要技术栈&#xff0c;从技术原理到常用语法&#xff0c;这次查缺补漏当作我的小百科。主要技术包括&#xff1a; ✅数据库常用&#xff1a;MySQL, Hive SQL, Spark SQL✅大数据处理常用&#xff1a;Pyspark, Pandas⚪ 图像处理常用&#…