编译 PPL.CV 遇到Could NOT find CUDA (missing: CUDA_INCLUDE_DIRS CUDA_CUDART_LIBRARY)

官方安装文档:https://mmdeploy.readthedocs.io/zh-cn/latest/01-how-to-build/linux-x86_64.html
ppl.cv 安装

问题描述

./build.sh cuda 编译报错: Could NOT find CUDA (missing: CUDA_INCLUDE_DIRS CUDA_CUDART_LIBRARY) (found version “11.8”)
编译日志:

mkdir: cannot create directory ‘/home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build’: File exists
cmd -> cmake -DCMAKE_BUILD_TYPE=Release  -DPPLCV_USE_CUDA=ON -DCMAKE_INSTALL_PREFIX=/home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install .. && cmake --build . -j 16 --config Release && cmake --build . --target install -j 16 --config Release
-- Populating hpcc
-- Configuring done
-- Generating done
-- Build files have been written to: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/deps/hpcc-subbuild
[100%] Built target hpcc-populate
CMake Error at /home/chenghj11/mmdeploy/cmake-3.20.0-linux-x86_64/share/cmake-3.20/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find CUDA (missing: CUDA_INCLUDE_DIRS CUDA_CUDART_LIBRARY) (found
  version "11.8")
Call Stack (most recent call first):
  /home/chenghj11/mmdeploy/cmake-3.20.0-linux-x86_64/share/cmake-3.20/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
  /home/chenghj11/mmdeploy/cmake-3.20.0-linux-x86_64/share/cmake-3.20/Modules/FindCUDA.cmake:1264 (find_package_handle_standard_args)
  deps/hpcc/cmake/cuda-common.cmake:7 (find_package)
  cmake/cuda.cmake:1 (include)
  CMakeLists.txt:67 (include)

grep -rn “CUDA_INCLUDE_DIRS” . | more 查找 cmake 文件中的两个变量,定位到 CUDA_INCLUDE_DIRS 变量的定义:
查找结果:

./cmake/cuda.cmake:42:list(APPEND PPLCV_INCLUDE_DIRECTORIES $<BUILD_INTERFACE:${CUDA_INCLUDE_DIRS}>)
(base) chenghj11@wlw-chenghj11:~/mmdeploy/ppl.cv-0.7.0$ grep -rn "CUDA_CUDART_LIBRARY" . | more
./cuda-build/CMakeCache.txt:267:CUDA_CUDART_LIBRARY:FILEPATH=CUDA_CUDART_LIBRARY-NOTFOUND
./cuda-build/CMakeCache.txt:621://ADVANCED property for variable: CUDA_CUDART_LIBRARY
./cuda-build/CMakeCache.txt:622:CUDA_CUDART_LIBRARY-ADVANCED:INTERNAL=1

chatgpt 查了一下 cmake 定义变量的几种方式:

  1. 通过 set 命令定义:
    set(MY_VAR “Hello, World!”)

  2. 通过命令的参数定义:
    project(MyProject)
    然后你可以使用 ${PROJECT_NAME} 来引用这个项目的名称。

  3. 通过 CMake 的内置变量:
    CMake 自带许多内置变量,例如 C M A K E S O U R C E D I R 、 {CMAKE_SOURCE_DIR}、 CMAKESOURCEDIR{CMAKE_BINARY_DIR} 等。它们在 CMake 处理过程中自动定义。

  4. 通过命令行或环境变量传递:
    cmake -DMY_VAR=“Hello, World!” …

  5. 通过文件(如 toolchain file 或 config file)定义:
    config.cmake 文件中定义变量:
    set(MY_VAR “Hello, World!”)
    然后在主 CMakeLists.txt 文件中包含这个文件:
    include(config.cmake)

  6. 通过查找包或模块定义:
    find_package(OpenCV REQUIRED) 这会设置一些 OpenCV 相关的变量,如 ${OpenCV_INCLUDE_DIRS} 和 ${OpenCV_LIBRARIES}。

确认是 通过查找包或模块定义的方法定义的 CUDA_INCLUDE_DIRS 。确切来说是 ./cmake/cuda.cmake 中 include ./deps/hpcc/cmake/cuda-common.cmake 第 7 行 find_package(CUDA REQUIRED)

解决办法

通过 chatgpt 回顾了一下 find_package 的查找逻辑,增加 CUDA_ROOT 环境变量:

export CUDA_ROOT=/usr/local/cuda-11.8

然后删除编译临时目录并重新编译

rm -rf cuda-build/ && ./build.sh cuda

编译成功,头文件和 lib 库都输出到:/home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/ 目录。
部分编译日志:

...
Install the project...
-- Install configuration: "Release"
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/allocator.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/common.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/compact_memory_manager.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/file_mapping.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/generic_cpu_allocator.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/half.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/lock_utils.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/log.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/object_pool.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/retcode.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/stripfilename.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/sys.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/include/ppl/common/types.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/lib/libpplcommon_static.a
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/lib/cmake/ppl/pplcommon-config.cmake
-- Up-to-date: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/./include
-- Up-to-date: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/./include/ppl
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/./include/ppl/cv
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/./include/ppl/cv/types.h
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/./include/ppl/cv/cuda
-- Installing: /home/chenghj11/mmdeploy/ppl.cv-0.7.0/cuda-build/install/./include/ppl/cv/cuda/copymakeborder.h
...

补充知识:cmake find_package 的查找逻辑

find_package 是 CMake 中用来查找并引入外部库或包的命令。它的查找逻辑相对复杂,并且可以根据具体的参数和配置有所变化。下面是 find_package 的查找逻辑的详细说明:

CMake 在查找包时,会依次按照以下顺序搜索路径:

  1. Package_ROOT 环境变量:查找 _ROOT 环境变量指向的路径(如果存在)。
  2. CMAKE_PREFIX_PATH 环境变量:查找 CMAKE_PREFIX_PATH 指定的路径。
  3. 系统默认路径:在 Unix 系统上,如 /usr/local 和 /usr。在 Windows 系统上,如 C:\Program
    Files。
  4. CMake 安装路径:CMake 自己的模块路径。
  5. 项目指定的路径:可以在 CMakeLists.txt 中指定自定义的查找路径。

在这个示例中,find_package(OpenCV REQUIRED) 会按照上述查找逻辑搜索 OpenCV 库,并定义相关的变量。如果查找失败,CMake 会报告错误并停止配置过程(因为使用了 REQUIRED 关键字)。

# 查找 OpenCV 库
find_package(OpenCV REQUIRED)

# 查找结果会定义一系列变量,如
# OpenCV_INCLUDE_DIRS, OpenCV_LIBRARIES 等
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(my_target ${OpenCV_LIBRARIES})

可以通过设置 CMAKE_PREFIX_PATH 或者直接在 find_package 调用中指定路径来自定义查找路径

# 设置自定义查找路径
set(CMAKE_PREFIX_PATH "/path/to/custom/location")

# 或者直接在 find_package 中指定路径
find_package(OpenCV REQUIRED PATHS "/path/to/custom/location")
  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值