Docker容器构建项目遇CMake错误:无法找到cudart库
Jetson TX2 Docker环境下CMake无法找到CUDA_CUDART_LIBRARY问题
环境信息
- 主机:Ubuntu 18.04,NVIDIA Jetson TX2
- 预装组件:Docker、nvidia-docker2、l4t-cuda
- 使用Docker镜像:stereolabs/zed:3.7-devel-jetson-jp4.6
核心编译错误
CMake Error at /usr/local/lib/python3.6/dist-packages/cmake/data/share/cmake-3.25/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find CUDA (missing: CUDA_CUDART_LIBRARY) (found suitable version "10.2", minimum required is "10.2") Call Stack (most recent call first): /usr/local/lib/python3.6/dist-packages/cmake/data/share/cmake-3.25/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE) /usr/local/lib/python3.6/dist-packages/cmake/data/share/cmake-3.25/Modules/FindCUDA.cmake:1266 (find_package_handle_standard_args) CMakeLists.txt:17 (find_package)
CMakeLists.txt完整内容
cmake_minimum_required (VERSION 3.5) project(vision) enable_testing() # Variables scopes follow standard rules # Variables defined here will carry over to its children, ergo subdirectories # Setup ZED libs find_package(ZED 3 REQUIRED) include_directories(${ZED_INCLUDE_DIRS}) link_directories(${ZED_LIBRARY_DIR}) # Setup CUDA libs for zed and ai modules find_package(CUDA ${ZED_CUDA_VERSION} REQUIRED) include_directories(${CUDA_INCLUDE_DIRS}) link_directories(${CUDA_LIBRARY_DIRS}) # Setup OpenCV libs find_package(OpenCV REQUIRED) include_directories(${OpenCV_INLCUDE_DIRS}) # Check if OpenMP is installed find_package(OpenMP) checkPackage("OpenMP" "OpenMP not found, please install it to improve performances: 'sudo apt install libomp-dev'") # TensorRT set(TENSORRT_ROOT /usr/src/tensorrt/) find_path(TENSORRT_INCLUDE_DIR NvInfer.h HINTS ${TENSORRT_ROOT} PATH_SUFFIXES include/) message(STATUS "Found TensorRT headers at ${TENSORRT_INCLUDE_DIR}") set(MODEL_INCLUDE ../code/includes) set(MODEL_LIB_DIR libs) set(YAML_INCLUDE ../depends/yaml-cpp/include) set(YAML_LIB_DIR ../depends/yaml-cpp/libs) include_directories(${MODEL_INCLUDE} ${YAML_INCLUDE}) link_directories(${MODEL_LIB_DIR} ${YAML_LIB_DIR}) # Setup Darknet libs #find_library(DARKNET_LIBRARY NAMES dark libdark.so libdarknet.so) #find_package(dark REQUIRED) # Setup HTTP libs find_package(httplib REQUIRED) find_package(nlohmann_json 3.2.0 REQUIRED) # System libs SET(SPECIAL_OS_LIBS "pthread") link_libraries(stdc++fs) # Optional definitions add_definitions(-std=c++17 -g -O3) # Add sub directories add_subdirectory(zed_module) add_subdirectory(ai_module) add_subdirectory(http_api_module) add_subdirectory(executable_module) option(RUN_TESTS "Build the tests" off) if (RUN_TESTS OR CMAKE_BUILD_TYPE MATCHES Debug) add_subdirectory(test)
Dockerfile中失败的构建步骤
WORKDIR /opt RUN git clone https://github.com/Cruiz102/Vision-Module WORKDIR /opt/Vision-Module RUN mkdir build-debug && cd build-debug RUN pwd WORKDIR /opt/Vision-Module/build-debug RUN cmake -DCMAKE_BUILD_TYPE=Release ..
/etc/docker/daemon.json配置内容
{ "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }, "default-runtime": "nvidia" }
已尝试但无效的解决方法
- 指定工具包路径
- 编辑daemon.json配置
- 重新安装依赖组件
- 更换Docker镜像
- 在主机重新安装cudart库
- 修改编译参数
- 采用交互模式构建容器
可行解决建议
- 显式指定CUDA根目录:Jetson平台CUDA默认路径为
/usr/local/cuda-10.2,在CMake命令中传入该路径:cmake -DCMAKE_BUILD_TYPE=Release -DCUDA_ROOT=/usr/local/cuda-10.2 .. - 检查容器内CUDA库存在性:进入容器交互模式,执行以下命令确认
libcudart.so是否存在:
若不存在,需确认使用的Docker镜像是否正确包含CUDA runtime环境。ls /usr/local/cuda/lib64/libcudart.so - 替换CMake CUDA查找模块:CMake 3.25版本的
FindCUDA模块对Jetson兼容性较差,改用FindCUDAToolkit模块,修改CMakeLists.txt中CUDA相关代码:# 替换原find_package(CUDA ...)部分 find_package(CUDAToolkit ${ZED_CUDA_VERSION} REQUIRED) include_directories(${CUDAToolkit_INCLUDE_DIRS}) link_directories(${CUDAToolkit_LIBRARY_DIR}) - 确认nvidia容器运行时生效:构建镜像时添加
--runtime=nvidia参数,或重启Docker服务确保daemon.json配置生效:sudo systemctl daemon-reload sudo systemctl restart docker
内容的提问来源于stack exchange,提问作者atlas7
相关产品推荐
相关产品推荐

