安装mmdet3d报错【fatal error: spconv/maxpool.h: No such file or directory】

部署运行你感兴趣的模型镜像

背景

  1. 安装mmdet3d库时报异常
pip3 install mmdet3d==0.17.3
  1. 异常内容
[6/7] /usr/local/cuda/bin/nvcc  -DWITH_CUDA -I/tmp/pip-install-kmdgu6d9/mmdet3d_b3a635dfc07f48c79988b482048acf29/mmdet3d/ops/spconv/include -I/usr/local/lib/python3.8/dist-packages/torch/include -I/usr/local/lib/python3.8/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.8/dist-packages/torch/include/TH -I/usr/local/lib/python3.8/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.8 -c -c /tmp/pip-install-kmdgu6d9/mmdet3d_b3a635dfc07f48c79988b482048acf29/mmdet3d/ops/spconv/src/maxpool_cuda.cu -o /tmp/pip-install-kmdgu6d9/mmdet3d_b3a635dfc07f48c79988b482048acf29/build/temp.linux-x86_64-3.8/mmdet3d/ops/spconv/src/maxpool_cuda.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_BFLOAT16_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options ''"'"'-fPIC'"'"'' -w -std=c++14 -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ -DTORCH_API_INCLUDE_EXTENSION_H '-DPYBIND11_COMPILER_TYPE="_gcc"' '-DPYBIND11_STDLIB="_libstdcpp"' '-DPYBIND11_BUILD_ABI="_cxxabi1011"' -DTORCH_EXTENSION_NAME=sparse_conv_ext -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_86,code=compute_86 -gencode=arch=compute_86,code=sm_86
      FAILED: /tmp/pip-install-kmdgu6d9/mmdet3d_b3a635dfc07f48c79988b482048acf29/build/temp.linux-x86_64-3.8/mmdet3d/ops/spconv/src/maxpool_cuda.o
      /usr/local/cuda/bin/nvcc  -DWITH_CUDA -I/tmp/pip-install-kmdgu6d9/mmdet3d_b3a635dfc07f48c79988b482048acf29/mmdet3d/ops/spconv/include -I/usr/local/lib/python3.8/dist-packages/torch/include -I/usr/local/lib/python3.8/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/lib/python3.8/dist-packages/torch/include/TH -I/usr/local/lib/python3.8/dist-packages/torch/include/THC -I/usr/local/cuda/include -I/usr/include/python3.8 -c -c /tmp/pip-install-kmdgu6d9/mmdet3d_b3a635dfc07f48c79988b482048acf29/mmdet3d/ops/spconv/src/maxpool_cuda.cu -o /tmp/pip-install-kmdgu6d9/mmdet3d_b3a635dfc07f48c79988b482048acf29/build/temp.linux-x86_64-3.8/mmdet3d/ops/spconv/src/maxpool_cuda.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_BFLOAT16_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options ''"'"'-fPIC'"'"'' -w -std=c++14 -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ -DTORCH_API_INCLUDE_EXTENSION_H '-DPYBIND11_COMPILER_TYPE="_gcc"' '-DPYBIND11_STDLIB="_libstdcpp"' '-DPYBIND11_BUILD_ABI="_cxxabi1011"' -DTORCH_EXTENSION_NAME=sparse_conv_ext -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_86,code=compute_86 -gencode=arch=compute_86,code=sm_86
      /tmp/pip-install-kmdgu6d9/mmdet3d_b3a635dfc07f48c79988b482048acf29/mmdet3d/ops/spconv/src/maxpool_cuda.cu:16:10: fatal error: spconv/maxpool.h: No such file or directory
         16 | #include <spconv/maxpool.h>
            |          ^~~~~~~~~~~~~~~~~~
      compilation terminated.
  1. 其实还有一连串其他相关的错误,都是spconv下的各种文件找不到,此处只截取一个maxpool.h作为示例说明

原因分析

  1. 从报错日志上看,错误原因很清晰: spconv/maxpool.h这个文件找不到

  2. C++头文件找不到的原因无非就两种:1)文件根本就不存在;2)文件确实存在,但C++的路径配置有问题(比如-I参数等)‘

  3. 无论上述哪种原因,都需要确认该头文件是谁提供的:1)第三方库(需要安装一些依赖库?或者源码中包含的第三方源码中提供的?);2)mmdet3d本身源码提供的

  4. 但是想确认谁提供的这个头文件,还是比较麻烦的,需要研究源码的实现。所以笔者采取偷懒的方法:先看源码中是否有该文件(包括源码中依赖的第三方源码),方法也和简单:直接整个目录下搜索该文件。

  5. 很巧,以下就搜到了,位置在:mmdet3d/ops/spconv/include下,那么就很清楚了
    在这里插入图片描述

  6. 从上图可以看到,目录下有maxpool.h、mp_helper.h、spconv_ops.h等各种头文件,正式之前编译时报错的这些文件。

  7. 再看编译命令,命令中也已经包含了该路径啊(下图红框中)
    在这里插入图片描述

  8. 那就奇怪了,源码中有需要的头文件,编译命令中也包含了该include的路径,怎么会找不到呢?真的很奇怪。

  9. 百思不得其解时,突然想到会不会下载的源码有问题?于是把pip install时打印出来的命令行里下的源码地址拿出来单独下载(下图红框中地址)
    在这里插入图片描述

  10. 把该源码地址的tar包单独下载、解压后,赫然发现mmdet3d/ops/spconv/下根本不存在include目录,和github上的代码完全不一样,无语凝噎

  11. 至此,报错原因找到,源码打包上传python库时有问题,导致pip安装时下载的源码不对

解决方法

  1. 从github上的官方仓库下载对应版本的源码
  2. 使用源码编译安装

后记

  1. 无语
  2. 笔者只测试了v0.17.3、v0.18.1两个版本,其他版本是否存在类似问题未知

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

在 Ubuntu 下进行 `gattlib` 的交叉编译时,若遇到报错信息 `fatal error: bluetooth/bluetooth.h: No such file or directory`,这表明编译器无法找到蓝牙相关的头文件。此问题通常源于系统中缺少蓝牙开发库的安装或交叉编译环境未正确配置。 要解决这一问题,首先应确保主机环境中已安装蓝牙开发库。对于基于 Debian 的系统(如 Ubuntu),可以通过以下命令安装: ```bash sudo apt-get install libbluetooth-dev ``` 该操作将安装包括 `bluetooth.h` 在内的蓝牙相关头文件和库,为后续的交叉编译提供基础支持[^1]。 在完成上述安装后,如果仍然遇到相同的错误,则可能是由于交叉编译器未能正确识别到这些头文件的位置。此时需要检查交叉编译器的路径设置是否包含蓝牙库头文件目录。可以尝试通过设置 `CFLAGS` 和 `CPPFLAGS` 来指定额外的头文件搜索路径: ```bash export CFLAGS="-I/usr/include/bluetooth" export CPPFLAGS="-I/usr/include/bluetooth" ``` 此外,在使用 CMake 进行交叉编译配置时,还可以通过 `-DCMAKE_C_FLAGS` 参数来添加头文件路径: ```bash cmake -DCMAKE_C_COMPILER=$CC -DCMAKE_C_FLAGS="-I/usr/include/bluetooth" .. ``` 这样做可以让交叉编译器知道去哪里查找 `bluetooth/bluetooth.h` 文件[^2]。 值得注意的是,当目标平台不是 x86 架构时,还需要确保所使用的交叉编译工具链能够正确地与目标架构兼容,并且该工具链已经包含了对蓝牙协议栈的支持。对于 ARM 架构的目标设备,推荐使用如 `arm-linux-gnueabi-gcc` 或者 Android NDK 提供的交叉编译器,并且可能需要手动复制或构建适用于目标平台的蓝牙库文件。 最后,在某些情况下,特别是针对特定嵌入式平台或者非标准发行版,可能需要从源码开始构建蓝牙库,以确保获得与目标环境完全匹配的版本。这种做法虽然较为复杂,但能有效避免因版本不一致导致的各种兼容性问题[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Garfield2005

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值