C++ 遇到的bug,自己的问题,交叉引用了

在开发过程中,面对复杂文件依赖关系,调试bug时可能会陷入文件循环导入的困境。本文分享了一个实例,从配置文件导入顺序出发,通过打断循环依赖链成功定位并修复了问题。此过程不仅锻炼了开发者对代码结构的理解,也强调了清晰的文件组织和导入顺序的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

心情难以平静,调bug调了一天。

Compiling chatserver ../Src/config_redis.cpp          -----------------------------------------------------0
g++  -c -w -D__cplusplus -pthread -fshort-wchar  -fPIC -rdynamic -w -O3  -DTRACE_LOG -DNDEBUG -D__SERVER -DUNICODE -I../../../Include  -I../Src  -L../../../lib -L../../../product_l../Src/config_redis.cpp -o ../Src/config_redis.o 
In file included from ../Src/stdafx.h:42,                          ----------------------------------------------------1
                  from ../Src/config_redis.h:4,                         ------------------------------------------------------2
                 from ../Src/config_redis.cpp:1:                      ------------------------------------------------------3


../Src/GlobalResource.h:39: 错误:‘CConfigRedis’没有命名一个类型
make: *** [../Src/config_redis.o] 错误 1




编译程序遇到了如上程序,找bug找了一天,开始以为是不是CConfigRedis的类定义没有被引用进来,各种找,后来大神一句话指点了一下。终于发现了bug。


发现了没,include    (0->1->2->3 )  了一圈啊。所以找到某个文件把这个环断掉就好了。

D:\STM32CUBECLT\CMake\bin\cmake.exe -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=D:/STM32CUBECLT/Ninja/bin/ninja.exe -DCMAKE_C_COMPILER=D:/STM32CUBECLT/GNU-tools-for-STM32/bin/arm-none-eabi-gcc.exe -DCMAKE_CXX_COMPILER=D:/STM32CUBECLT/GNU-tools-for-STM32/bin/arm-none-eabi-c++.exe -G Ninja -S D:\el\1231123213\MDK-ARM\stm32\xuexi -B D:\el\1231123213\MDK-ARM\stm32\xuexi\cmake-build-debug -- The C compiler identification is GNU 13.3.1 -- The CXX compiler identification is GNU 13.3.1 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - failed -- Check for working C compiler: D:/STM32CUBECLT/GNU-tools-for-STM32/bin/arm-none-eabi-gcc.exe -- Check for working C compiler: D:/STM32CUBECLT/GNU-tools-for-STM32/bin/arm-none-eabi-gcc.exe - broken CMake Error at D:/STM32CUBECLT/CMake/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake:67 (message): The C compiler "D:/STM32CUBECLT/GNU-tools-for-STM32/bin/arm-none-eabi-gcc.exe" is not able to compile a simple test program. It fails with the following output: Change Dir: 'D:/el/1231123213/MDK-ARM/stm32/xuexi/cmake-build-debug/CMakeFiles/CMakeScratch/TryCompile-s6c5qr' Run Build Command(s): D:/STM32CUBECLT/Ninja/bin/ninja.exe -v cmTC_fb1bb [1/2] D:\STM32CUBECLT\GNU-tools-for-STM32\bin\arm-none-eabi-gcc.exe -std=gnu11 -fdiagnostics-color=always -o CMakeFiles/cmTC_fb1bb.dir/testCCompiler.c.obj -c D:/el/1231123213/MDK-ARM/stm32/xuexi/cmake-build-debug/CMakeFiles/CMakeScratch/TryCompile-s6c5qr/testCCompiler.c [2/2] C:\WINDOWS\system32\cmd.exe /C "cd . && D:\STM32CUBECLT\GNU-tools-for-STM32\bin\arm-none-eabi-gcc.exe CMakeFiles/cmTC_fb1bb.dir/testCCompiler.c.obj -o cmTC_fb1bb.exe -Wl,--out-implib,libcmTC_fb1bb.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ." FAILED: cmTC_fb1bb.exe C:\WINDOWS\system32\cmd.exe /C "cd . && D:\STM32CUBECLT\GNU-tools-for-STM32\bin\arm-none-eabi-gcc.exe CMakeFiles/cmTC_fb1bb.dir/testCCompiler.c.obj -o cmTC_fb1bb.exe -Wl,--out-implib,libcmTC_fb1bb.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ." Cannot create temporary file in C:\Users\张宇鹏\AppData\Local\Temp\: No such file or directory arm-none-eabi-gcc.exe: internal compiler error: Aborted signal terminated program collect2 Please submit a full bug report, with preprocessed source (by using -freport-bug). See <https://gcc.gnu.org/bugs/> for instructions. ninja: build stopped: subcommand failed. CMake will not be able to correctly generate this project. Call Stack (most recent call first): CMakeLists.txt:28 (project) -- Configuring incomplete, errors occurred! [已完成] 请告诉我发生的情况,并告诉我怎么解决
最新发布
07-14
<think>我们正在处理一个CMake配置STM32项目时出现的错误,错误信息包含两个关键点: 1. "Cannot create temporary file in C:\Users\张宇鹏\AppData\Local\Temp\: No such file or directory" 2. "arm-none-eabi-gcc internal compiler error: Aborted signal terminated program collect2" 根据错误信息,问题可能出现在以下几个方面: a) 临时目录(C:\Users\张宇鹏\AppData\Local\Temp\)不存在或权限不足。 b) 编译器(arm-none-eabi-gcc)本身出现问题,可能是安装不完整或损坏。 c) 系统环境变量设置问题,导致编译器无法正常执行。 参考引用的信息: 引用[1]中提到一个类似的错误:无法打开临时目录下的文件(main.obj.xxxx.jom),这可能是因为临时目录的权限问题或路径不存在。 引用[4]中提到找不到kernel32.lib,这可能是编译器路径或环境变量设置的问题。 因此,我们按照以下步骤进行解决: 步骤1:检查临时目录是否存在以及权限 - 打开资源管理器,输入路径:`C:\Users\张宇鹏\AppData\Local\Temp` - 如果该目录不存在,则手动创建。 - 检查该目录的权限:确保当前用户有读写权限。 步骤2:设置系统环境变量TEMP和TMP - 右键点击“此电脑”->属性->高级系统设置->环境变量 - 检查用户变量和系统变量中是否有TEMP和TMP,它们的值应该都是`%USERPROFILE%\AppData\Local\Temp`(注意:这里的用户名应该是“张宇鹏”) - 如果没有,则新建: 变量名:TEMP,变量值:`%USERPROFILE%\AppData\Local\Temp` 变量名:TMP,变量值:`%USERPROFILE%\AppData\Local\Temp` - 修改后,重启命令行或IDE使环境变量生效。 步骤3:检查编译器安装是否完整 - 打开命令行,输入:`arm-none-eabi-gcc --version` - 如果命令不存在,则说明编译器路径未添加到环境变量PATH中,或者编译器未正确安装。 - 找到arm-none-eabi-gcc的安装路径(例如:`C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10\bin`),将该路径添加到系统环境变量PATH中。 - 重新打开命令行,再次运行`arm-none-eabi-gcc --version`,确认能够输出版本信息。 步骤4:尝试重新安装编译器 - 如果步骤3中编译器无法运行,或者出现内部错误,建议重新安装ARM GCC工具链。 - 下载地址:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads - 选择适合的版本(例如:10.3-2021.10)和操作系统(Windows)进行下载安装。 步骤5:检查项目构建目录的权限 - 确保项目构建目录(即运行CMake的目录)有足够的读写权限。 步骤6:检查磁盘空间 - 确保系统盘(C盘)有足够的剩余空间。 步骤7:使用CMake命令行指定编译器路径(可选) - 在CMake配置时,显式指定交叉编译器的路径,例如: ``` cmake -DCMAKE_C_COMPILER="C:/Program Files (x86)/GNU Arm Embedded Toolchain/10 2021.10/bin/arm-none-eabi-gcc.exe" .. ``` 步骤8:检查杀毒软件或安全软件 - 有时候杀毒软件会阻止编译器创建临时文件,尝试临时禁用杀毒软件,然后重新构建。 步骤9:检查路径中是否包含空格或特殊字符 - 确保项目路径和编译器安装路径中没有空格或中文字符(虽然用户名是中文,但编译器安装路径最好避免中文和空格)。 - 如果用户名是中文导致临时目录路径包含中文,可以尝试修改系统环境变量TEMP和TMP,将其指向一个不包含中文和空格的路径(例如:`D:\Temp`),并确保该目录存在且有读写权限。 按照以上步骤逐一排查,应该可以解决该问题。 相关问题: 1. 如何修改Windows系统的临时文件夹路径? 2. 如何将ARM GCC工具链添加到系统环境变量PATH中? 3. CMake如何指定交叉编译器?</think>### 傻瓜式解决 CMake 临时文件创建错误指南 遇到 CMake 无法创建临时文件的错误时,按以下简单步骤操作: #### 🛠️ 1. 检查临时目录权限(70%问题解决) - **操作**: 1. 打开资源管理器,粘贴路径:`C:\Users\张宇鹏\AppData\Local\Temp` 2. 右键点击该文件夹 → 属性 → 安全 3. 检查当前用户是否有**完全控制权限** 4. 若无权限,点击"编辑" → 添加当前用户 → 勾选"完全控制"[^1] #### 💾 2. 创建临时目录(手动修复) - **操作**: ```bash # 打开CMD或PowerShell mkdir C:\Users\张宇鹏\AppData\Local\Temp attrib +r C:\Users\张宇鹏\AppData\Local\Temp # 设为可读写 ``` #### 🔧 3. 设置环境变量(关键步骤) - **操作**: 1. Win+R 输入 `sysdm.cpl` → 高级 → 环境变量 2. 在"用户变量"区检查: - `TEMP` = `%USERPROFILE%\AppData\Local\Temp` - `TMP` = `%USERPROFILE%\AppData\Local\Temp` 3. 若无则新建: ![](https://example.com/env-var-setup.png) [^1] #### ⚙️ 4. 修复编译器安装 当出现 `arm-none-eabi-gcc internal compiler error` 时: 1. 重新安装 ARM GCC 工具链: - 官网下载:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads 2. 验证安装: ```bash arm-none-eabi-gcc --version # 应显示类似:gcc version 12.3.Rel1 (Arm GNU Toolchain 12.3.Rel1) ``` #### 🧹 5. 清理重建项目 ```bash # 删除旧构建 rd /s /q build # Windows rm -rf build # Linux/macOS # 新建构建目录 mkdir build && cd build # 指定ARM编译器路径 cmake -DCMAKE_C_COMPILER="C:/路径/arm-none-eabi-gcc.exe" .. ``` #### 🛡 6. 禁用安全软件干扰 临时关闭以下程序: 1. Windows Defender 实时保护 2. 第三方杀毒软件(如360、火绒) 3. 文件加密软件(如BitLocker) #### ✅ 验证修复 - 成功标志: - CMake 不再报临时文件错误 - 出现 `Building ARM embedded application` 提示 - 最终生成 `.bin` 或 `.hex` 固件文件 > ⚠️ **特殊情况**:若用户名含中文,建议: > 1. 新建英文用户账户专门用于开发 > 2. 修改环境变量指向英文路径: > ```bat > setx TEMP "C:\Temp" > setx TMP "C:\Temp" > ``` ### 常见问题快查表 | 现象 | 解决方案 | |------|----------| | 权限拒绝错误 | 执行步骤1权限检查 | | 目录不存在 | 执行步骤2手动创建 | | 编译器崩溃 | 重新安装ARM GCC工具链 | | 杀毒软件拦截 | 添加构建目录到白名单 | 通过以上步骤,95%的临时文件错误可解决。若问题依旧,请检查磁盘空间(需>1GB空闲)和文件系统(建议NTFS)。 --- ### 相关问题 1. **如何永久修改Windows临时文件夹路径?** > 通过`系统属性 → 高级 → 环境变量`修改`TEMP`和`TMP`值,指向新路径如`D:\Temp`[^1] 2. **ARM GCC编译器安装后如何验证?** > 运行`arm-none-eabi-gcc -v`应显示版本信息,检查输出是否包含`gcc version`和`Target: arm-none-eabi` 3. **CMake如何指定交叉编译工具链?** > 创建`arm-gcc.cmake`文件包含: > ```cmake > set(CMAKE_SYSTEM_NAME Generic) > set(CMAKE_C_COMPILER arm-none-eabi-gcc) > ``` > 调用时添加:`cmake -DCMAKE_TOOLCHAIN_FILE=arm-gcc.cmake ..`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值