ESP32工程添加.c .h文件及常见错误

一、编译环境添加

如果编译的文件在main文件夹下,在main文件夹下的CMakeLists.txt中添加对应的.c文件,如下图所示。
在这里插入图片描述

二、常见问题

1- undefined reference to xxx

C语言中使用static修饰函数时,意味着该函数的作用域仅限于定义它的文件。如果你在另一个文件中调用这个函数,编译器会找不到这个函数的定义,因此会报“undefined reference to”错误。
在对应的.c及声明文件.h中去掉函数中的“static”关键字。

例如,如果你有两个文件:file1.cpp 和 file2.cpp。

‌file1.cpp‌:

#include <iostream>
static void myFunction() {std::cout << "Hello, world!" << std::endl;
}

‌file2.cpp‌:

void callMyFunction() {myFunction();  // 这里会报错,因为myFunction是static的,作用域仅限于file1.cpp
}

要解决这个问题,你有几个选项:

‌1、移除static修饰符‌:如果myFunction需要在多个文件中被访问,就不应该使用static修饰它。

2‌、**在需要使用函数的文件中重新定义函数‌:**这通常不是最佳做法,因为它会导致代码冗余。

‌3、将函数声明和定义放在一个头文件中,并在需要的文件中包含这个头文件‌:这样,函数就可以在多个文件中被访问,但仍然只会有一个定义。

选择哪种方法取决于你的具体需求和项目的结构。**如果函数是通用的,建议移除static修饰符,并在适当的地方声明和定义函数。**如果函数是特定于某个文件的,保留static修饰符,并确保只在该文件内调用它。

2- multiple definition of xxx

在 C 或 C++ 的项目中,.h 文件(头文件)通常用于声明函数、变量、类型等,而 .c 或 .cpp 文件用于定义这些函数和变量。如果在 .h 文件中定义了变量,那么在多个 .c 或 .cpp 文件中包含这个头文件时,就会出现“multiple definition of”(多重定义)的错误。

这是因为每个包含该头文件的源文件都会创建一个该变量的副本,导致链接时变量重复定义。

解决方法:
1、在头文件中声明变量,在源文件中定义变量‌:
在 .h 文件中使用 extern 关键字声明变量,而不是定义它。
在一个 .c 或 .cpp 文件中定义该变量。
例如:

// myheader.h
extern int myVariable;// myfile.c
#include "myheader.h"
int myVariable = 10;

‌2、使用 static 关键字‌:

在头文件中定义变量时,可以使用 static 关键字,这样每个包含该头文件的源文件都会有该变量的一个独立副本,链接器不会报错。
例如:

// myheader.h
static int myVariable = 10;

‌使用匿名命名空间或内联变量(C++17 起)‌:

如果你使用的是 C++,可以考虑将变量放在匿名命名空间中,或者使用 inline 关键字(C++17)。
例如:

// myheader.h
namespace {int myVariable = 10;
}// 或者
inline int myVariable = 10;

选择哪种方法取决于你的具体需求,例如是否需要跨多个文件共享同一个变量。通常,第一种方法是最常见的做法。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Python123题库】#体育收入排行2012-2019

禁止转载&#xff0c;原文&#xff1a;https://blog.csdn.net/qq_45801887/article/details/140087809 参考教程&#xff1a;B站视频讲解——https://space.bilibili.com/3546616042621301 有帮助麻烦点个赞 ~ ~ Python123题库 体育收入排行2012-2019 体育收入排行2012-2019 …

CentOS7 MySQL8.0 启动失败 Data Dictionary initialization failed

CentOS7 MySQL8.0 启动失败 Data Dictionary initialization failed 重点&#xff01;&#xff01;&#xff01; 此方案会删除数据的&#xff01;&#xff01;&#xff01; 类似重置一样&#xff01; 报错 查看日志&#xff1a;/var/log/mysqld.log 解决方案 查看配置文…

Python热频随机森林分类器算法模型模拟

&#x1f3af;要点 研究发射测量斜率和时滞热频率表征&#xff0c;使用外推法计算三维磁场并定性比较使用基于焓的热演化环模型模拟每条线的热力学响应&#xff0c;测试低频、中频和高频热场景使用光学薄、高温、低密度等离子体的单位体积辐射功率或发射率公式等建模计算使用直…

动手学深度学习(四)卷积神经网络-下

全连接层存在的问题&#xff1a;参数过大&#xff0c;计算成本过高。 一、网络中的网络&#xff08;NiN&#xff09; 1、NiN块 ①NiN块的结构 NiN串联多个由卷积层和“全连接”层构成的小网络来构建一个深层网络。这种由卷积层和“全连接”层构成的小网络就是NiN块。 &#…

SpringBoot框架之KOB项目 - 配置Mysql与注册登录模块(上)

框架模型 每一个客户端&#xff08;client&#xff09;都会和后端&#xff08;SpringBoot&#xff09;进行通信&#xff0c;例如如果一个用户进行登录&#xff0c;需要向后端发送username、password&#xff0c;SpringBoot可以理解为一个一直在跑的程序&#xff0c;不断对用户…

3.Java高级编程实用类介绍(一)

三、Java高级编程实用类介绍(一) 文章目录 三、Java高级编程实用类介绍(一)一、枚举类型二、包装类三、Math 一、枚举类型 使用enum进行定义 public enum 枚举名字{值1,值2.... }二、包装类 每个基本类型在java.lang包中都有一个相应的包装类 /** new包装类&#xff08;字符…

上海儿童自闭症寄宿制学校,让孩子找到归属感

在探讨自闭症儿童教育的广阔图景中&#xff0c;上海作为一座充满人文关怀的城市&#xff0c;始终致力于为这些特殊的孩子提供更加全面、专业的支持体系。而当我们把这份关注与努力投射到具体实践上&#xff0c;广州的星贝育园自闭症儿童寄宿制学校便成为了这样一个温馨而有力的…

JVM OutOfMemoryError 与 StackOverflowError 异常

目录 前言 堆溢出 虚拟机栈和本地方法栈溢出 方法区溢出 前言 JVM规范中规定, 除了程序计数器之外, 其他的运行时数据区域, 例如堆栈, 方法区, 都会出现OutOfMemoryError异常. 那么到底是怎么样的代码, 才会引起堆溢出, 栈溢出, 或者是方法区的溢出呢? 如果遇到了又该如何…

鸿蒙next json解析 ArkUI 带你玩转 arkts json解析

前言导读 相信很多同学再开发过程中都会遇到json解析的处理&#xff0c;不管是跟服务端交互 或者是读取本地的json 都会遇到json解析 那么正好今天有空正好讲一下鸿蒙next里面的json解析 JSON解析与生成 本模块提供了将JSON文本转换为JSON对应对象或值&#xff0c;以及将对象…

Mac OS系统如何下载安装Python解释器

目录 Mac安装Python的教程 mac下载并安装python解释器 如何下载和安装最新的python解释器 访问python.org&#xff08;受国内网速的影响&#xff0c;访问速度会比较慢&#xff0c;不过也可以去我博客的资源下载&#xff09; 打开历史发布版本页面 进入下载页 鼠标拖到页面…

【经典文献】双边滤波

文章目录 ICCV 1998基本思路双边高斯滤波 ICCV 1998 1995年&#xff0c;Aurich和Weule提出一种非线性高斯滤波器&#xff0c;三年后&#xff0c;Tomasi和Manduchi将其用于图像平滑&#xff0c;并将其命名为双边滤波。 Aurich, V., & Weule, J. (1995). Non-linear Gaussi…

【C++】list常见用法

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;C从小白到高手 &#x1f339;往期回顾&#x1f339;&#xff1a;[C]vector常见用法 &#x1f516; 流水不争&#xff0c;争的是滔滔不息。 文章目录 一、list的介绍li…

web安全测试入门

参考课程&#xff1a; 04-软件安全测试基础-网络协议基础-网络模型_哔哩哔哩_bilibili 1.软件安全测试概述 安全测试&#xff1a; 安全性测试指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程 导致软件出现安全问题的主要原因或根源是软件的安全漏洞 安全漏洞&#x…

Vue2源码解读

vue源码_哔哩哔哩_bilibili 1.Vue源码路径目录解读 Vue2源码的路径目录被设计得非常清晰&#xff0c;每个文件夹都承担着特定的职责和功能。以下是这些主要文件夹&#xff08;compiler、core、platform、server、sfc、shared&#xff09;的详细解读&#xff1a; 1. compiler …

变压器漏感对整流电路的影响

目录 1. 电压波形畸变 2. 输出电压波动 3. 电流纹波增加 4. 降低整流效率 5. 影响开关器件的性能 6. EMI&#xff08;电磁干扰&#xff09;增加 总结与应对措施 变压器漏感在整流电路中会产生一些影响&#xff0c;尤其在高频应用或电流变化较大的情况下&#xff0c;其影…

【Java】多线程:Thread类并行宇宙

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在现代编程中&#xff0c;多线程是提高程序性能和响应能力的一种重要手段。Java 通过 Thread 类和 Runnable 接口提供了丰富的线程管理功能。本文是对 Thread 类基本用法的总结。 线程创建 线程可以…

GEE 案例:利用2001-2024年的MODIS数据长时序ndvi指数归一化后的结果分析

目录 简介 指数 数据 代码 结果 简介 利用2001-2024年的MODIS数据长时序ndvi指数归一化后的结果分析&#xff0c;并加载时序图。 指数 NDVI指数&#xff08;Normalized Difference Vegetation Index&#xff09;是用来评估地表植被覆盖度和健康程度的指数。它通过计算红…

PMP--一模--解题--121-130

文章目录 12.采购管理--投标人会议&#xff08;又称承包商会议、供应商会议或投标前会议&#xff09;是在卖方提交建议书之前&#xff0c;在买方和潜在卖方之间召开的会议&#xff0c;其目的是确保所有潜在投标人对采购要求都有清楚且一致的理解&#xff0c;并确保没有任何投标…

【数据结构取经之路】图解AVL树

目录 AVL树的前世今生 走进AVL AVL树的实现 1、AVL树节点的定义 2、AVL树的插入 3、完整代码 AVL树的性能 AVL树的前世今生 我们知道&#xff0c;普通的二叉搜索树在不少场景下可以提高我们的查找效率。例如下面这种情况&#xff0c;我们要找22。从根开始&#xff0c;…

搭建一个基于角色的权限验证框架

说明&#xff1a;基于角色的权限验证&#xff08;Role-Based Access Control&#xff0c;RBAC&#xff09;框架&#xff0c;是目前大多数服务端的框架。本文介绍如何快速搭建一个这样的框架&#xff0c;不用Shiro、Spring Security、Sa-Token这样的“大框架”实现。 RBAC 基于…