多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Jetson nano 编译 librealsense 报错 Could NOT find Vulkan:CMake 配置修复与验证

Jetson nano 编译 librealsense 报错 Could NOT find Vulkan:CMake 配置修复与验证 1. Jetson nano 编译 librealsense 时 Vulkan 找不到到底卡在哪如果你在 Jetson nano 上编译 librealsenseCMake 阶段突然抛出Could NOT find Vulkan (missing: VULKAN_LIBRARY VULKAN_INCLUDE_DIR)紧接着又看到The Xinerama headers were not found那你不是一个人。这个报错组合在 JetPack 4.5 / L4T 32.5.0 的 Nano 上非常典型尤其是你明明用同一张镜像刷过另一台机器、那台却编译通过的时候会让人怀疑人生。先把结论说清楚Vulkan 这条Could NOT find在 librealsense 2.40.0 这个版本里很多时候只是 CMake 的一个探测提示真正让Configuring incomplete失败的是后面 GLFW 的 Xinerama 头文件缺失。也就是说Vulkan 报错是“烟雾弹”Xinerama 才是“真凶”。但两者经常一起出现所以本文会把 Vulkan 的识别逻辑、依赖补齐、CMake 参数、重新验证的完整链路都走一遍让你下次遇到同类 CMake 找不到库的问题能自己定位。这篇适合谁手上有一台 Jetson nanoJetPack 4.x想编译 librealsense 做深度相机开发或者正在被 CMake 的missing: XXX_LIBRARY XXX_INCLUDE_DIR折磨的嵌入式同学。下面所有命令都可以直接复制我会标出每一步的预期输出方便你对照。2. 先确认环境与依赖再谈 Vulkan 配置动手之前先让环境信息可复现。Jetson nano 的 JetPack 版本、CUDA、Vulkan 运行时版本都会影响 CMake 的探测结果。用jetson_release -v看一眼重点确认三件事L4T 版本、Vulkan 版本、Python 版本。jetson_release -v在 JetPack 4.5 上你大概率会看到类似输出L4T 32.5.0、CUDA 10.2.89、Vulkan 1.2.70、Python 3.6.9。注意这里Vulkan: 1.2.70说明系统里其实是有 Vulkan 运行时的但 CMake 依然报找不到VULKAN_LIBRARY和VULKAN_INCLUDE_DIR原因通常是缺开发包头文件 链接库而不是缺运行时。补齐依赖分两层。第一层是 Vulkan 开发相关第二层是 GLFW 窗口创建需要的 X11 扩展头文件。很多人只装了第一层结果 Vulkan 找到了却倒在 Xinerama 上。sudo apt-get update sudo apt-get install -y libvulkan-dev vulkan-utils sudo apt-get install -y libxinerama-dev libxcursor-dev libxi-dev libxrandr-devlibvulkan-dev提供vulkan/vulkan.h和libvulkan.so正好对应 CMake 要找的VULKAN_INCLUDE_DIR与VULKAN_LIBRARY。libxinerama-dev、libxcursor-dev则是 GLFW 在 X11 下编译的硬依赖。装完之后可以用下面两条命令快速确认文件确实到位ls /usr/include/vulkan/vulkan.h ls /usr/lib/aarch64-linux-gnu/libvulkan.so两条都能列出文件说明 Vulkan 开发环境已经具备被 CMake 识别的条件。如果第一条报 No such file说明libvulkan-dev没装上回到上一步重装即可。注意Jetson nano 的 apt 源偶尔会慢如果apt-get update卡住先确认网络正常再重试不要中途 CtrlC 留下半装的包。3. 可复制的 CMake 配置与编译命令依赖齐了之后进入 librealsense 源码目录建一个干净的 build 目录。这里强调“干净”是因为 CMake 会缓存上一次的探测结果如果之前失败过缓存里可能还留着VULKAN_LIBRARY-NOTFOUND直接重跑会继续报错。cd ~/RealSense/librealsense-2.40.0 rm -rf build mkdir build cd build然后是核心的 cmake 命令。针对 Jetson nano 的 USB 相机场景通常要开FORCE_RSUSB_BACKEND并带上 Python 绑定cmake ../ \ -DFORCE_RSUSB_BACKENDON \ -DBUILD_PYTHON_BINDINGS:booltrue \ -DPYTHON_EXECUTABLE/usr/bin/python3 \ -DCMAKE_BUILD_TYPERelease如果你希望显式告诉 CMake Vulkan 的位置避免它自己猜可以再加两个变量。这在多版本 Vulkan 共存或路径非标准时特别有用cmake ../ \ -DFORCE_RSUSB_BACKENDON \ -DBUILD_PYTHON_BINDINGS:booltrue \ -DPYTHON_EXECUTABLE/usr/bin/python3 \ -DVULKAN_INCLUDE_DIR/usr/include \ -DVULKAN_LIBRARY/usr/lib/aarch64-linux-gnu/libvulkan.so \ -DCMAKE_BUILD_TYPERelease参数含义对照如下方便你按需裁剪参数作用建议值FORCE_RSUSB_BACKEND强制走 USB 后端绕过内核补丁ONBUILD_PYTHON_BINDINGS生成 pyrealsense2truePYTHON_EXECUTABLE指定 Python 解释器/usr/bin/python3VULKAN_INCLUDE_DIRVulkan 头文件目录/usr/includeVULKAN_LIBRARYVulkan 链接库路径/usr/lib/aarch64-linux-gnu/libvulkan.soCMAKE_BUILD_TYPE编译优化级别Release配置成功后你会看到-- Configuring done和-- Generating done最后一行是Build files have been written to。这时候 Vulkan 那行可能仍然显示Could NOT find Vulkan但只要没有CMake Error且配置完成就可以继续编译。因为 librealsense 对 Vulkan 是可选依赖找不到时会自动降级不影响核心功能。接着编译。Jetson nano 内存只有 4GB直接make -j4容易 OOM建议用-j2甚至-j1make -j2 sudo make install sudo ldconfig编译过程大概几十分钟到一小时取决于 SD 卡速度。如果中途出现virtual memory exhausted或进程被 kill就是内存不够降到-j1重来。4. 验证 Vulkan 是否被识别以及 pyrealsense2 是否可用配置完成后先回头确认 Vulkan 到底有没有被 CMake 认到。最直接的办法是翻 CMake 的输出日志或者用cmake --system-information过滤cmake --system-information | grep -i vulkan如果输出里出现VULKAN_LIBRARY:FILEPATH/usr/lib/aarch64-linux-gnu/libvulkan.so和VULKAN_INCLUDE_DIR:PATH/usr/include说明 Vulkan 已经被正确识别。如果还是NOTFOUND说明前面的libvulkan-dev没装好或者你用的 cmake 命令没带上显式路径。再验证 Vulkan 运行时本身是否正常vulkaninfo | head -n 20能打印出 GPU 名称、API 版本等信息就说明 Vulkan 运行时没问题。这一步和 CMake 识别是两回事运行时在不代表开发头文件在反之亦然。最后验证 librealsense 的 Python 绑定。这是判断编译是否真正成功的硬指标python3 -c import pyrealsense2 as rs; print(rs.__version__); print(len(dir(rs)))正常会打印版本号如 2.40.0和一个较大的数字可用符号数量。你也可以进交互式环境看一眼python3 import pyrealsense2 as rs dir(rs)[:10]能列出align、config、pipeline这些名字就说明 pyrealsense2 已经装好可以接相机跑深度流了。如果 import 报ModuleNotFoundError多半是make install没执行或ldconfig没跑补一下即可。5. 本篇常见报错排查清单把这次踩到的坑整理成一张排查表下次遇到同类 CMake 报错可以按顺序过一遍。报错信息根因处理Could NOT find Vulkan (missing: VULKAN_LIBRARY VULKAN_INCLUDE_DIR)缺 libvulkan-dev 开发包apt 安装 libvulkan-devThe Xinerama headers were not found缺 libxinerama-devapt 安装 libxinerama-dev libxcursor-devConfiguring incomplete, errors occurred上面任一依赖缺失补齐依赖后删 build 重跑virtual memory exhaustedNano 内存不足make -j1 降并发ModuleNotFoundError: pyrealsense2未 install 或未 ldconfigsudo make install sudo ldconfig重新 cmake 仍报 NOTFOUNDCMake 缓存了旧结果rm -rf build 后重建几个容易忽略的点单独说。第一CMake 缓存非常顽固改完依赖一定要删 build 目录否则它读的还是旧的CMakeCache.txt。第二FORCE_RSUSB_BACKENDON和OFF会影响后端选择Nano 上建议保持 ON避免折腾内核补丁。第三编译时如果 CMake 提示要联网下载第三方库网络不稳会卡很久可以提前把依赖装全减少在线拉取。提示如果你在配置阶段看到Could NOT find apriltag这属于可选依赖缺失不影响主流程可以忽略。6. 编译通过之后把调试效率也提上来librealsense 编译通过只是第一步后面你大概率要反复跑 Python 脚本调深度流、对齐、点云还要查 API 用法、对比不同版本的参数。这时候如果每次都在 Nano 本地翻文档、试参数效率会很低。我自己的做法是把模型对话和接入文档放在手边遇到rs.config()参数不确定、或者 pipeline 启动报错时直接查证再改代码比盲试快很多。需要查 librealsense 的 API 用法、CMake 参数含义或者想快速验证一段 pyrealsense2 代码逻辑可以用模型对话https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 配合接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 一起看前者帮你解释报错和参数后者给你可复制的接入示例。如果你后面要长期在 Nano 上做视觉编码、写 Agent 脚本可以考虑 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 把常用调试流程固化下来。API Key 在控制台生成https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 生成后填到你的脚本或工具里即可。回到编译本身最后再给一个收尾动作把这次成功的 cmake 命令写进一个build.sh下次换机器或重刷系统直接跑省得再回忆参数。脚本里记得带上rm -rf build避免缓存问题重演。
返回列表