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,一经查实,立即删除!

相关文章

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

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

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

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

【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;哎~ 问题引…

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

一、资料前言 本套数码相机摄影资料&#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. 菜单的几种类型 根…

如何实现文件上传到阿里云OSS!!!(结合上传pdf使用)

一、开通阿里云OSS对象存储服务 对象存储 OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;提供 99.995 % 的服务可用性和多种存储类型&#xff0c;适用于数据湖存储&#xff0c;数据迁移&#xff0c;企…

数据结构- 顺序表-单链表-双链表 --【求个关注!】

文章目录 一 顺序表代码&#xff1a; 二 链表单链表双向链表 一 顺序表 顺序表是线性表的一种 所谓线性表指一串数据的组织存储在逻辑上是线性的&#xff0c;而在物理上不一定是线性的 顺序表的底层实现是数组&#xff0c;其由一群数据类型相同的元素组成&#xff0c;其在逻辑…

「Word 论文排版」插入分节符导致word转PDF后出现空白页

问题 word转PDF后出现空白页 解决 但是此方法会让页面页脚标记出错 TODO 如下图所示 在论文目录后有一个分节符&#xff0c;转成PDF之后就多了一个空白页 文件-打印-页面设置-选中封面那一页-版式-从偶数页开始 再导出空白页就没了

Java编程题 | 数组元素交换

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 编写一个Java程序&#xff0c;输入一个整数数组&#xff0c;将最大的元素与第一个元素交换&#xff0c;最小的元素与最后一个元素交换&#xff0c;然后输出修改后的数组…

香港多IP服务器在建立高可用性网站架构中的作用?

香港多IP服务器在建立高可用性网站架构中的作用&#xff1f; 在构建高可用性的网站架构时&#xff0c;选择合适的服务器和配置是至关重要的。香港多IP服务器因其独特的地理和技术优势&#xff0c;成为了全球许多企业的首选。这些服务器由于拥有多个IP地址&#xff0c;能够提供…

OpenHarmony多媒体-mp3agic

简介 mp3agic 用于读取 mp3 文件和读取/操作 ID3 标签&#xff08;ID3v1 和 ID3v2.2 到 ID3v2.4&#xff09;,协助开发者处理繁琐的文件操作相关&#xff0c;多用于操作文件场景的业务应用。 效果展示&#xff1a; 下载安装 ohpm install ohos/mp3agicOpenHarmony ohpm环境配…

Docker Desktop打开一直转圈的解决办法

安装Docker Desktop之前确保你的Hyper-V已经打开 开启后需要重新安装重新安装重新安装这是最关键的一步&#xff0c;博主自己看了很多教程&#xff0c;最后试着重装了一下解决了 安装DockerDesktop的时候我的电脑根本就没有Hyper-V这个功能选项&#xff0c;可能是这个问题 如…