【已解决】detectron2安装失败: error: identifier “single_box_iou_rotated“ is undefined

1、问题描述

当我在detectron2的Github上把安装包下载到本地后,我在Anaconda中通过以下命令对detectron2进行安装:

python -m pip install -e path_to_detectron2_Directory

但是会安装失败并有以下报错:

2、解决办法

修改源码"detectron2\layers\csrc\nms_rotated\nms_rotated_cuda.cu":

修改前:

// Copyright (c) Facebook, Inc. and its affiliates.
#include <ATen/ATen.h>
#include <ATen/cuda/CUDAContext.h>
#include <c10/cuda/CUDAGuard.h>
#include <ATen/cuda/CUDAApplyUtils.cuh>
#ifdef WITH_CUDA
#include "../box_iou_rotated/box_iou_rotated_utils.h"
#endif
// TODO avoid this when pytorch supports "same directory" hipification
#ifdef WITH_HIP
#include "box_iou_rotated/box_iou_rotated_utils.h"
#endif

修改后:

// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
#include <ATen/ATen.h>
#include <ATen/cuda/CUDAContext.h>
#include <c10/cuda/CUDAGuard.h>
#include <ATen/cuda/CUDAApplyUtils.cuh>
//NOTE: replace relative import
/*#ifdef WITH_CUDA
#include "../box_iou_rotated/box_iou_rotated_utils.h"
#endif
// TODO avoid this when pytorch supports "same directory" hipification
#ifdef WITH_HIP
#include "box_iou_rotated/box_iou_rotated_utils.h"
#endif*/
#include "box_iou_rotated/box_iou_rotated_utils.h"

相关链接:

文章参考1

文章参考2

detectron2_Github

<think>我们正在处理一个编译错误:identifier "OLED_SCL_Pin" is undefined。这个错误通常发生在C/C++编程中,当编译器遇到一个未声明的标识符时。根据用户提供的引用,我们可以参考类似的未定义标识符错误的解决思路。 分析: 1. 错误信息:identifier "OLED_SCL_Pin" is undefined,意味着编译器在当前位置找不到`OLED_SCL_Pin`的定义。 2. 可能的原因: a. 头文件未包含:可能定义`OLED_SCL_Pin`的头文件没有被包含在当前文件中。 b. 拼写错误:可能是大小写或者拼写错误,比如实际定义可能是`OLED_scl_pin`或`OLED_SCL_PIN`等。 c. 作用域问题:可能定义在某个命名空间内,使用时需要指定命名空间。 d. 未定义:确实没有定义,需要检查相关代码或库是否包含该定义。 e. 宏定义问题:如果`OLED_SCL_Pin`是一个宏,可能在编译时没有正确设置宏定义。 参考类似问题的解决: 引用[1]中,`__builtin_addressof`未定义,解决方式可能是调整编译选项或确保使用正确的编译器支持。 引用[2]中,`__ldg`未定义,解决方式是确保编译目标架构(-arch)支持该内置函数(即计算能力3.5以上)。 引用[3]中,`__hadd2`和`__hfma2`未定义,解决方式是设置正确的计算能力架构(如--gpu-architecture=70)。 但是,`OLED_SCL_Pin`看起来是一个用户自定义的变量或宏,而不是CUDA内置函数。因此,我们主要从C/C++项目的角度来考虑。 解决步骤: 1. **检查头文件**:确认包含定义了`OLED_SCL_Pin`的头文件。例如,如果它是在某个硬件抽象层库中定义的,需要包含对应的头文件(如`#include "stm32f4xx_hal.h"`或具体设备的头文件)。 2. **检查拼写**:仔细检查标识符的拼写,包括大小写。在C语言中,标识符是大小写敏感的。 3. **检查定义位置**: - 如果是全局变量,确保在使用前已经定义(或者在头文件中用extern声明,然后在源文件中定义)。 - 如果是宏定义,检查宏定义是否在包含顺序中在使用之前。 4. **检查库和链接**:如果`OLED_SCL_Pin`来自某个外部库,确保该库已经正确添加到项目中(包括头文件路径和源文件路径,以及链接库)。 5. **检查硬件支持**:如果`OLED_SCL_Pin`是特定开发板(如STM32)上的引脚定义,确保使用的板级支持包(BSP)或硬件抽象层(HAL)库支持该开发板,并且该引脚定义在对应的头文件中存在。 6. **检查配置**:有时,引脚定义是通过配置工具(如STM32CubeMX)生成的,需要重新生成代码并包含到项目中。 7. **查看文档或示例**:参考所使用的OLED库的文档或示例程序,确认`OLED_SCL_Pin`的正确使用方式。 8. **如果使用开发板**:确认开发板型号和库是否匹配。例如,对于STM32,不同型号的芯片其引脚定义可能不同。 示例解决方案: 假设我们使用的是STM32 HAL库,并且通过STM32CubeMX生成了代码,那么`OLED_SCL_Pin`应该定义在`main.h`或类似的文件中(如`gpio.h`)。请检查: - 在代码开头包含正确的头文件:`#include "main.h"` 或 `#include "gpio.h"`。 如果头文件中确实没有定义,则可能是CubeMX配置中未定义该引脚,需要重新配置并生成代码。 如果用户自己定义,则需要在头文件中添加类似: ```c #define OLED_SCL_Pin GPIO_PIN_6 #define OLED_SCL_GPIO_Port GPIOB ``` 或者如果是变量,则需要在源文件中定义: ```c uint16_t OLED_SCL_Pin = GPIO_PIN_6; ``` 但是,通常我们会使用宏定义或结构体成员来访问。 因此,根据上述分析,我们给出以下解决建议: 1. 确认包含定义`OLED_SCL_Pin`的头文件。 2. 检查拼写。 3. 如果头文件中有定义,检查是否在包含该头文件之前有条件编译指令导致该定义被跳过。 4. 检查项目配置,确保定义`OLED_SCL_Pin`的文件被正确包含在编译过程中。 如果用户使用的是特定的OLED驱动库,请确保该库已经正确安装并配置。 由于用户没有提供具体的代码环境,我们只能给出一般性建议。 相关问题: 1. 如何检查C/C++项目中未定义的标识符? 2. 在嵌入式开发中,如何定义和使用GPIO引脚? 3. 使用STM32CubeMX生成代码时,如何添加自定义的引脚定义? 4. 如何避免头文件重复包含导致的编译错误? 5. 在C/C++项目中,如何正确设置头文件包含路径? 注意:以上问题可以帮助用户深入理解并解决类似问题。</think>### identifier "OLED_SCL_Pin" is undefined 错误分析与解决 该错误表示编译器无法识别`OLED_SCL_Pin`标识符,通常发生在嵌入式开发中(如STM32等),常见原因及解决方案如下: #### 错误原因分析 1. **头文件未包含** `OLED_SCL_Pin`通常定义在OLED屏幕的驱动头文件中,未包含相关头文件会导致未定义错误。 2. **引脚定义缺失** 在开发板配置文件中(如`main.h`或`gpio.h`),缺少对OLED_SCL引脚的具体定义。 3. **拼写/大小写错误** 实际定义可能是`OLED_SCL_PIN`(全大写)或`OLED_Scl_Pin`(大小写混合),需检查一致性[^1]。 4. **作用域问题** 若定义在`.c`文件而非头文件中,需在调用前添加`extern`声明。 5. **配置工具未更新** 使用STM32CubeMX等工具配置引脚后,未重新生成代码导致定义缺失。 #### 解决方案 ```c // ✅ 方案1:添加头文件包含(示例) #include "ssd1306.h" // OLED驱动库头文件 #include "stm32f4xx_hal.h" // HAL库头文件 // ✅ 方案2:检查/添加引脚定义(在main.h中) #define OLED_SCL_Pin GPIO_PIN_6 #define OLED_SCL_GPIO_Port GPIOB // ✅ 方案3:检查拼写一致性 // 确保代码中统一使用 OLED_SCL_Pin 或 OLED_SCL_PIN // ✅ 方案4:添加extern声明(若定义在.c文件) extern uint16_t OLED_SCL_Pin; // 声明外部变量 ``` #### 验证步骤 1. 在工程中全局搜索`OLED_SCL_Pin`,确认定义位置 2. 检查包含路径: ```makefile # 在Makefile中确保路径正确 INC_DIR = -I./Drivers/OLED ``` 3. 若使用STM32CubeMX: - 打开`.ioc`文件 - 检查GPIO配置中是否分配了SCL引脚 - 点击"Generate Code"重新生成代码 #### 预防措施 - 使用**枚举或常量**避免拼写错误: ```c typedef enum { OLED_SCL = GPIO_PIN_6, OLED_SDA = GPIO_PIN_7 } OLED_Pins; ``` - 在头文件中添加**静态断言**: ```c static_assert(OLED_SCL_Pin != 0, "OLED_SCL_Pin not defined!"); ``` > **关键提示**:此错误通常由硬件抽象层配置不完整导致,需检查以下文件: > - `Core/Inc/main.h` > - `Drivers/OLED/ssd1306.h` > - `STM32CubeMX生成的gpio.c`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值