Makefile应用

Makefile实例

在c.c里面,包含一个头文件c.h,在c.h里面定义一个宏,把这个宏打印出来。

c.c:

#include <stdio.h>
#include <c.h>

void func_c()
{
	printf("This is C = %d\n", C);
}

c.h

#define C 1

然后上传编译,执行./test,打印出:
在这里插入图片描述
测试没有问题,然后修改c.h
在这里插入图片描述
重新编译,发现没有更新程序,运行结果不变,说明现在的Makefile存在问题。

为什么会出现这个问题呢?首先test依赖c.o,c.o依赖c.c,如果我们更新c.c,会重新更新整个程序。但c.o也依赖c.h,我们更新了c.h,并没有在Makefile上体现出来,导致c.h的更新,Makefile无法检测到。

因此需要添加:

c.o: c.c c.h

现在每次修改c.h,Makefile都能识别到更新操作,从而更新最后输出文件。

我们怎么为每个.c文件添加.h文件呢?对于内核,有几万个文件,不可能为每个文件依次写出其头文件。因此需要做出改进,让其自动生成依赖

gcc -M c.c // 打印出依赖

gcc -M -MF c.d c.c  // 把依赖写入文件c.d

gcc -c -o c.o c.c -MD -MF c.d  // 编译c.o, 把依赖写入文件c.d

修改Makefile

objs = a.o b.o c.o

dep_files := $(patsubst %,.%.d,$(objs))
dep_files := $(wildcard $(dep_files))

test: $(objs)
	gcc -o test $^

ifneq($(dep_files),)
include $(dep_files)
endif 

%.o:%.c
	gcc -c -o $@ $< -MD -MF .$@.d

clean:
	rm *.o test

disclean:
	rm $(dep_files)

.PHONY:clean

首先用obj变量将.o文件放在一块。
利用前面讲到的函数,把obj里所有文件都变为.%.d格式,并且用变量dep_files表示。
利用前面介绍的wildcrad函数,判断dep_files是否存在。

如果dep_files变量不为空,就将其包含进来。

再添加CFLAGS,即编译参数。比如加上编译参数-Werror,把所有的警告当成错误。

CFLAGS = -Werror -Iinclude 
...
%.o:%.c
	gcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d

CFLAGS是一个变量,用于存储传递给编译器的编译选项,具体来说,CFLAGS中包含了两个选项:

  1. -Werror:将编译警告(warnings)视为错误(errors)。通常,编译器会生成一些警告,但它们不会阻止程序的编译。使用’-Werror’选项会将这些警告当做错误,如果有任何警告,编译过程将被中断。
  2. -Iinclude:将指定目录’include’添加到头文件搜索路径中。这对于告诉编译器在哪里找到包含的头文件是很有用的。

总体来说,使用双引号“file.h”会首先在当前目录中查找头文件,然后再去系统目录中查找。而使用尖括号<file.h>只会在系统目录中查找。
选择使用哪一种形式通常取决于头文件是项目内的还是标准库的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跨国企业如何选择安全靠谱的跨国传输文件软件?

随着全球化的不断发展&#xff0c;跨国企业之间的合作变得越来越频繁。而在这种合作中&#xff0c;如何安全、可靠地将文件传输给合作伙伴或客户&#xff0c;成为了跨国企业必须面对的问题。 然而&#xff0c;跨国文件传输并不是一件容易的事情&#xff0c;由于网络物理条件的…

Mysql-库的操作

1.创建数据库 CREATE DATABASE [IF NOT EXISTS] name name后可以加 CHARACTER SET 或者是 charsetname COLLATE collation_name &#xff08;mysql数据库不区分大小写&#xff09; 说明&#xff1a; name表示想创建的库的名字大写的表示关键字 [] 是可选项 CHARACTER SET…

Linux调试器-gdb使用

程序的开发过程 debug和release ​ 程序的发布版本有debug和release版本&#xff0c;debug就是可被调试的&#xff08;debug环境下程序可以进行调试&#xff09;&#xff0c;release是发行版本&#xff0c;测试人员和用户使用的版本。Linux下我们编译代码时默认是release版本&…

苍穹外卖项目学习日记(13)

苍穹外卖项目学习日记(13) day10 Spring task cron表达式 导入spring task坐标&#xff08;spring-context已经存在&#xff09;&#xff0c;添加EnableScheduling注解 订单状态定时处理 新建task包&#xff0c;并且创建OrderTask定时类&#xff0c;添加处理超时订单和处…

网络运维Day12

文章目录 yum概述部署阿里镜像源yum基本使用 NFS网络文件系统NFS共享概述部署NFS服务端部署NFS客户端 Tomcat服务实验拓扑安装Tomcat启动服务客户端&#xff08;真机&#xff09;浏览访问页面测试 Tomcat虚拟主机NGINX服务web服务器对比NGINX简介实验拓扑虚拟机A源码编译安装NG…

ESP32-DHT11温湿度数据上传MQTT服务器

ESP32-DHT11温湿度数据上传MQTT服务器 简介ESP32DHT11 实验实验说明接线MQTT服务器建立连接添加订阅 ESP32驱动DHT11ESP32向MQTT服务器发送数据上传温湿度数据实验结果 简介 ESP32 点击图片购买 ESP32 系列模组集成 Wi-Fi、传统蓝牙和低功耗蓝牙功能&#xff0c;具有广泛的用途…

centos7系统离线安装tcpdump抓包软件、使用教程

tcpdump 是Linux系统下的一个强大的命令&#xff0c;可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 本教程对tcpdump命令使用进行讲解说明&#xff0c;通…

对话金山云高级副总裁刘涛 | 做大模型公司的助力者

“ AIGC的应用化阶段将很快到来&#xff1b;AGI&#xff0c;已步入助手阶段。” 口述 | 刘涛 整理 | 梦婕&云舒 出品&#xff5c;极新 在10月的最后一天&#xff0c;极新有幸采访到了金山云高级副总裁刘涛。我们深入探讨了“云计算逐鹿 AIGC”的话题。作为中国公有云互…

Redhat Linux v8.2 实时内核环境配置及参数调优

BC-Linux V8.2 实时内核环境配置及参数调优 -------物理机 & 虚拟机 一、前言 本文档包含有关Redhat Linux for Real Time的基本安装和调试信息。许多行业和组织需要极高性能的计算&#xff0c;并且可能需要低且可预测的延迟&#xff0c;尤其是在金融和电信行业中。延迟&…

【MySQL】入门基础

文章目录 1 :peach:数据库基础:peach:1.1 :apple:什么是数据库:apple:1.2 :apple:主流数据库:apple:1.3 :apple:服务器/数据库/表关系:apple:1.4 :apple:MySQL架构:apple:1.5 :apple:SQL分类:apple:1.6 :apple:存储引擎:apple: 2 :peach:库的操作:peach:2.1 :apple:创建数据库:…

Xilinx MIPI4.3——bg<x>_pin<y>_nc

摘要&#xff1a;由于使用的需要&#xff0c;我要在一个bank上面使用4个MIPI D-PHY&#xff1b;如果pin的指定&#xff0c;跨了bytegroup就会出现bg<x>_pin<y>_nc信号&#xff0c;而且如果一个bit slice control被多个byte group 使用会发生报错&#xff1b;所以我…

202311.13 windows通过vscode ssh远程连接到Ubuntu 连接失败 waiting for server log

关闭VScode时没有关闭终端的Ubuntu进程&#xff1f; 导致重启后不能正常连接到Ubuntu了 Windows 系统自带的cmd终端通过ssh 可以连接 应该是vscode里对Ubuntu 的服务器端配置出了问题 参考&#xff1a;记录 VSCode ssh 连接远程服务器时出错及解决方法 在Windows 的vscode里面执…

关于MySQL优化的思考二【性能分析工具、优化原则】

在实际的工作中&#xff0c;我们不免需要对SQL预计进行分析和优化&#xff0c;今天我们就来一起看下相关内容&#xff1a; SQL性能分析 SQL优化原则 1 SQL性能分析 对SQL进行性能分析&#xff0c;主要有&#xff1a; 查看慢SQL 通过profile详情查看 explain执行计划 1.1…

大语言模型可以学习规则11.13

大型语言模型可以学习规则 摘要1 引言2 准备3 从假设到理论3.1 诱导阶段&#xff1a;规则生成和验证3.2 演绎阶段&#xff1a;使用规则库进行显式推理 4 实验评估实验装置4.2 数字推理 5 相关工作 摘要 当提示一些例子和中间步骤时&#xff0c;大型语言模型&#xff08;LLM&am…

Kotlin之控制语句和表达式

原文链接 Kotlin Controls and Expressions 有结果返回的是表达式&#xff0c;没有返回的称之为语句&#xff0c;语句最大的问题是它没有返回值&#xff0c;那么想要保存结果就必然会产生副作用&#xff0c;比如改变变量。很多时候这是不够方便的&#xff0c;并且在多线程条件…

基于springboot实现社区疫情防控平台管理系统项目【项目源码】

基于springboot实现社区疫情防控平台管理系统演示 SpringBoot框架 SpringBoot是一个全新开源的轻量级框架。基于Spring4.0设计&#xff0c;其不仅继承了Spring框架原来有的优秀特性&#xff0c;而且还通过简化配置文件来进一步简化了Spring应用的整个搭建以及开发过程。另外在…

语言大模型的预训练过程——从无尽数据到海量知识

从目前研究结果看&#xff0c;Transformer是足够强大的特征抽取器&#xff0c;通过预训练过程&#xff0c;Transformer学到了什么&#xff1f;知识是如何存取的&#xff1f;我们又如何修正错误知识&#xff1f;本文讲述这方面的研究进展。 1、求知&#xff1a;LLM学到了什么知…

【代码随想录】算法训练计划20

1、654. 最大二叉树 题目&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建…

YOLO目标检测——番茄数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;番茄检测数据集说明&#xff1a;番茄目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签…

CMake中的字符串操作

如果使用set进行字符串拼接&#xff0c;对应的命令格式如下&#xff1a; set(变量名1 ${变量名1} ${变量名2} ...) 关于上面的命令其实就是将从第二个参数开始往后所有的字符串进行拼接&#xff0c;最后将结果存储到第一个参数中&#xff0c;如果第一个参数中原来有数据会对原…