linux c/c++ 编译没错,运行出错

本文探讨了C++编程中常见的内存错误,包括glibc detected **free(): invalid next size(normal)错误及段错误,分析了这些错误产生的原因,并提供了排查和解决内存泄漏的方法。

问题记录-

1.当glibc detected *** free(): invalid next size (normal)出现

http://blog.youkuaiyun.com/mociml/article/details/6286311 

2. 段错误:smallbin double linked list corrupted

http://blog.youkuaiyun.com/shaochat/article/details/40817313

问题注意点:

1. 出现编译没错,运行出错。

编译只是在语法上进行检查。

a. 运行的时候就需要注意了,是否用了 空地址(指针),或者说尝试 访问(有时候打印都出错).....

(用了一块没有申请成功的内存, 或者说 已经delete )


b  .   for 循环,数组越界(肯定会报     断错误.. 核心已转储...   ..),运行(一般不会超过一分钟)      

2.运行一段时间 后(或者说,程序运行后...大于一分钟左右)

内存泄漏...

(首先应该定位到出现内存泄漏在地方,排查 很有难度)

(new  和 delete 是否对应)  (是否delete已经删除过的 , 这个报错 有提示的)

<think>嗯,用户遇到了在C/C++项目中无法打开头文件'led.h'的问题,编译时报错“cannot open source file led.h”。我需要帮他解决这个问题。首先,我得回忆一下常见的头文件找不到的原因。通常这类问题可能有几个方面:头文件路径未正确配置、头文件命名或路径错误、项目结构问题,或者编译器配置问题。 首先,用户提到的是在TIM_test项目的main.c第60行出现这个错误。我需要检查头文件包含的语句是否正确。比如,用户是否写了#include "led.h",而实际上头文件可能不在当前目录下,或者在子目录里,这时候可能需要相对路径,比如#include "subdir/led.h"。或者,如果头文件在系统目录或项目指定的其他目录中,可能需要使用尖括号,但一般用户自定义头文件还是用双引号。 接下来,头文件的路径是否被添加到编译器的包含路径中。比如在MDK或者IAR这样的IDE中,需要在项目设置里添加头文件所在的目录到包含路径。比如用户提到的引用[2]中,提到在Target Option的C/C++设置里定义宏,类似地,可能需要在这里添加包含路径。如果是使用GCC命令行编译,可能需要使用-I选项指定路径。 然后,检查文件是否存在。用户可能拼错了头文件名,或者头文件实际不存在于指定的位置。比如,可能是Led.h而不是led.h,尤其是在区分大小写的系统上。或者头文件被误放在其他目录里。 另外,项目结构的问题也可能导致。比如头文件和源文件不在同一个项目目录下,或者没有被正确添加到项目中。有些IDE需要显式添加文件到项目,即使它们在物理上存在,如果没添加到项目里,编译器可能找不到。 还有可能是编译器的配置问题,比如引用的[2]中提到的STM32的例子,用户可能需要配置预处理器宏或者包含路径。这时候需要检查IDE的项目设置,确保所有必要的包含路径都已正确设置。 可能的解决步骤包括: 1. 确认头文件led.h的物理位置,是否在项目目录或其子目录中。 2. 检查#include语句是否正确,路径是否正确。 3. 在IDE中添加头文件所在目录到包含路径。 4. 检查文件名大小写是否匹配。 5. 确保文件被添加到项目中(如Visual Studio需要包含在项目里)。 6. 清理并重新生成项目,有时候缓存可能导致问题。 用户可能已经检查过部分内容,但需要一步步引导他排查。比如,先确认led.h是否存在,再检查包含路径是否正确添加。如果是使用MDK,可以参考引用[2]中的方法,在C/C++设置里添加路径。如果是其他环境如Eclipse或VS,步骤类似,但具体操作可能不同。 此外,生成相关问题的时候,可能需要考虑头文件包含的常见错误、编译器配置、项目结构管理等。比如如何正确配置包含路径,如何处理相对路径和绝对路径,或者如何处理不同开发环境中的类似问题。</think>### 解决 C/C++ 编译时 'cannot open source file led.h' 的问题 #### 1. 检查头文件路径和命名 - **文件存在性**:确认 `led.h` 文件实际存在于项目目录中。例如: - 若项目路径为 `TIM_test/`,则 `led.h` 应位于 `TIM_test/` 或其子目录(如 `TIM_test/inc/`)中。 - 使用文件资源管理器或命令行工具(如 `ls` 或 `dir`)验证文件路径。 - **命名一致性**:检查文件名是否与代码中的引用完全一致,包括大小写。例如,`led.h` 与 `LED.H` 在区分大小写的系统(如 Linux)中会被视为不同文件[^3]。 #### 2. 修正头文件包含语句 - **相对路径引用**: - 若 `led.h` 位于当前源文件(`main.c`)同级目录,直接使用 `#include "led.h"`。 - 若位于子目录(如 `inc/`),则需使用 `#include "inc/led.h"`。 - **绝对路径(不推荐)**:避免使用绝对路径(如 `#include "C:/project/inc/led.h"`),会降低代码可移植性。 #### 3. 配置编译器包含路径 - **在 IDE 中添加路径**(以 Keil MDK 为例): 1. 右键点击项目 > `Options for Target` > `C/C++` 选项卡。 2. 在 `Include Paths` 中添加 `led.h` 所在目录(例如 `../inc`)[^2]。 - **命令行编译(如 GCC)**:使用 `-I` 参数指定路径: ```bash gcc -I ./inc main.c -o output ``` #### 4. 验证项目结构 - **文件添加到工程**:在 IDE 中确保 `led.h` 已被添加到项目文件列表。例如: - 在 Visual Studio 中右键项目 > `添加现有项`。 - 在 Eclipse 中右键项目 > `Import` > `File System`。 #### 5. 清理并重新编译 - 执行清理操作(如 `Build > Clean`),删除临时文件和缓存,再重新编译项目。 --- ### 相关问题 1. **如何避免头文件重复包含?** 答:使用 `#pragma once` 或 `#ifndef HEADER_NAME_H` 宏定义保护。 2. **相对路径和绝对路径在头文件引用中有何优劣?** 答:相对路径可移植性强,但层级复杂时易出错;绝对路径稳定性高,但难以跨平台使用。 3. **跨平台项目中如何处理路径大小写问题?** 答:统一使用小写命名,并在代码中严格匹配大小写。 4. **如何调试编译器找不到第三方库的头文件?** 答:检查环境变量(如 `PATH`)、编译器的包含路径配置,以及库是否安装完整。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Teleger

你的支持是我前进的方向

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值