官方安装文档:https://mmdeploy.readthedocs.io/zh-cn/latest/01-how-to-build/linux-x86_64.html
问题描述
./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 定义变量的几种方式:
-
通过 set 命令定义:
set(MY_VAR “Hello, World!”) -
通过命令的参数定义:
project(MyProject)
然后你可以使用 ${PROJECT_NAME} 来引用这个项目的名称。 -
通过 CMake 的内置变量:
CMake 自带许多内置变量,例如 C M A K E S O U R C E D I R 、 {CMAKE_SOURCE_DIR}、 CMAKESOURCEDIR、{CMAKE_BINARY_DIR} 等。它们在 CMake 处理过程中自动定义。 -
通过命令行或环境变量传递:
cmake -DMY_VAR=“Hello, World!” … -
通过文件(如 toolchain file 或 config file)定义:
config.cmake 文件中定义变量:
set(MY_VAR “Hello, World!”)
然后在主 CMakeLists.txt 文件中包含这个文件:
include(config.cmake) -
通过查找包或模块定义:
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 在查找包时,会依次按照以下顺序搜索路径:
- Package_ROOT 环境变量:查找 _ROOT 环境变量指向的路径(如果存在)。
- CMAKE_PREFIX_PATH 环境变量:查找 CMAKE_PREFIX_PATH 指定的路径。
- 系统默认路径:在 Unix 系统上,如 /usr/local 和 /usr。在 Windows 系统上,如 C:\Program
Files。 - CMake 安装路径:CMake 自己的模块路径。
- 项目指定的路径:可以在 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")