进我自己的空间竟然报这个错。

本文记录了一次MySQL查询过程中遇到的服务器断开连接错误(Errno. 2006),并提供了具体的SQL查询语句。该问题可能由多种原因造成,如配置问题、网络波动或服务器负载过高等。

MySQL Error Message: MySQL Query Error SQL:

 

SELECT o.id,o.title FROM os_user_applications u join os_applications o on o.id = u.application_id where username='choasrules' and approved != -2 and allowsidenav=1 order by displayorder asc limit 0,5

 

Error: MySQL server has gone away

Errno.: 2006

 

 

蛋疼!

# 题目重述 你确认已正确使用 `extern` 在 `.h` 文件中声明变量,并在对应的 `.c` 文件中定义该变量,且头文件被正确包含,但仍然出现链接误(如:`undefined reference to 'xxx'`),需要一步排查原因。 --- # 详解 既然你确认以下步骤都“正确”: - ✅ 在 `.h` 文件中写了 `extern u8 var;` - ✅ 在某个 `.c` 文件中写了 `u8 var = 0;` - ✅ 其他文件(如 `main.c`)包含了这个 `.h` - ✅ 没有重复定义 - ✅ 工程结构看似完整 **但依然:`undefined reference to 'var'`** 那么问题很可能出在以下几个 **隐蔽但常见** 的环节: --- ## 🔍 排查 1:`.c` 文件未加入编译(最常见!) 即使你写了 `key.c` 并在里面定义了变量,如果它**没有被编译工程**,就不会生成 `.o` 文件 → 链接器自然找不到符号! ### ✅ 检查方法(以不同开发环境为例): | 环境 | 检查方式 | |------|---------| | **Keil MDK** | 打开项目树,看 `key.c` 是否在 "Source Group" 下 | | **STM32CubeIDE / SW4STM32** | 左侧 Project Explorer 中,`key.c` 是否显示?右键 Build 是否参与? | | **VS Code + Makefile** | 查看 `Makefile` 中的 `SRC` 列表是否包含 `key.c` | | **Arduino + STM32** | 不推荐,库管理混乱,建议换标准工程 | > ❌ 若 `key.c` 只是“存在于文件夹”,但没加到编译列表 → **不会参与编译!** 🔧 **解决办法**:手动将 `.c` 文件添加到项目中,重新构建。 --- ## 🔍 排查 2:变量名拼写误或大小写不一致 C语言区分大小写! ```c // key.h extern u8 Key_Value; // key.c u8 key_value = 0; // ❌ 误:Key_Value ≠ key_value ``` 或者: ```c u8 KeyValue = 0; // 少了个下划线 ``` 这种细微差别编译器不会提醒,但链接时。 ✅ **建议**:用搜索功能全局查找变量名,确保完全一致。 --- ## 🔍 排查 3:编译器优化导致“未引用”而被移除(少见但可能) 如果你定义了变量: ```c u8 Key_Value = 0; ``` 但在整个程序中**从未赋值或读取**,某些高级优化级别(`-O2`, `-O3`)可能会将其从最终目标文件中**丢弃**。 虽然通常不会影响 `extern` 引用,但在极端情况下可能出现异常。 ✅ **解决方法**: ```c volatile u8 Key_Value = 0; // 加 volatile 阻止优化 ``` 并确保至少有一次实际使用(比如打印、判断等)。 --- ## 🔍 排查 4:头文件路径未包含或未更新 虽然你在 `main.c` 写了: ```c #include "key.h" ``` 但如果编译器找不到这个头文件(路径不对),就会跳过声明 → 实际上 `main.c` 根本不知道 `extern` 存在。 不过这种情况通常是“找不到头文件”或警告未声明就使用。 ✅ 检查: - `key.h` 是否和 `main.c` 在同一目录,或已在编译器中设置包含路径? - 是否复制粘贴时漏掉了? --- ## 🔍 排查 5:IDE 缓存/构建系统未刷新 有时候你改了代码,但 IDE 没有重新编译相关文件(尤其是 Makefile 或旧工程)。 例如: - 修改了 `key.c` 添加变量定义 - 但只编译了 `main.o`,没重新编译 `key.o` 结果还是老的目标文件 → 没有新符号 ✅ **解决方法**: - 执行 **Clean + Rebuild All** - 删除 `Build` 或 `Objects` 文件夹后重新编译 - 使用命令行工具可执行: ```bash make clean && make ``` --- ## 🔍 排查 6:函数内静态变量 or 匿名命名空间问题(阶) 不要把局部静态变量或 `static` 变量暴露给外部: ```c // key.c void Key_Scan(void) { static u8 Key_Value = 0; // ❌ 局部静态,无法被 extern 访问 } ``` 或者用了 `static` 修饰全局变量: ```c // key.c static u8 Key_Value = 0; // ❌ static 限制作用域为本文件,外部不可见! ``` 这是故意隐藏变量的行为,`extern` 无法访问! ✅ 正确做法:去掉 `static` ```c u8 Key_Value = 0; // ✅ 全局可见 ``` --- ## ✅ 终极验证方法:检查 `.o` 文件是否有符号 使用命令行工具(适用于使用 GCC 的环境,如 STM32CubeIDE、PlatformIO 等): ```bash arm-none-eabi-nm key.o | grep Key_Value ``` 预期输出: ``` 00000001 B Key_Value ``` - `B`:bss 段(未初始化全局变量) - `D`:data 段(已初始化) - 如果无输出 → 说明变量根本没被编译去! 同理查 `main.o` 是否引用了它: ```bash arm-none-eabi-nm main.o | grep Key_Value ``` 应看到类似: ``` U Key_Value ``` - `U` 表示 “Undefined” —— 正常!表示等待链接时填充地址 👉 只有当 `key.o` 有定义(B/D)、`main.o` 有引用(U)时,才能成功链接! --- # 知识点 - **.c文件必须加入编译**:仅存在磁盘不等于参与构建,需显式加入工程。 - **变量名严格匹配**:大小写、拼写、下划线都不能,C语言区分敏感字符。 - **避免使用static修饰需共享的变量**:static使变量仅限本文件访问,阻止extern跨文件引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值