【open3d】Windows 下编译 Open3D C++ 源码完整教程

【open3d】Windows 下编译 Open3D C++ 源码完整教程


文章目录


前言

Open3D 官方推荐使用 CMake + Visual Studio 作为 Windows 平台 C++ 源码的编译工具链,以下是从环境准备、源码获取到编译安装、工程配置的全流程步骤,适配最新版 Open3D 源码,兼容 Visual Studio 2019/2022(64位)。

参考1

参考2


编译前环境准备(必装组件)

核心编译工具

  • CMake :版本 ≥ 3.21(Open3D 官方最低要求),官网下载 64位安装包,安装时勾选 Add CMake to the system PATH for all users (添加到系统环境变量)。

    bash 复制代码
    cmake --version
  • Visual Studio官网下载 2019 或 2022 社区版/专业版,安装时必须勾选 使用C++的桌面开发 工作负载,同时确保包含 MSVC 编译器Windows SDK (建议 10.0.19041.0 及以上)。

    bash 复制代码
    "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -property catalog_productLineVersion
  • Git :用于克隆 Open3D 源码,官网下载 64位版本,安装时默认勾选添加到环境变量。

    bash 复制代码
    git --version

依赖项

Open3D 源码会自动下载并配置所有编译依赖(如 Eigen、GLFW、Boost 等),但是由于网络延迟等种种原因,后续可能需要手动下载安装替换。

环境要求

  • 系统:Windows 10/11 64位(32位系统不支持)
  • 磁盘空间:至少 20GB 空闲(源码+依赖+编译产物)
  • 内存:建议 16GB 及以上(8GB 可能出现编译卡顿/内存不足)

CMake 配置(生成 Visual Studio 工程文件)

获取 Open3D 源码(Git 克隆)

  1. 打开 Git BashWindows 终端 ,切换到想要存放源码的目录:

    bash 复制代码
    cd E:\ && mkdir Open3D && cd Open3D
  2. 克隆 Open3D 源码仓库(包含所有子模块,必须加 --recursive):

    • 官方仓库(推荐):

      bash 复制代码
      git clone --recursive https://github.com/isl-org/Open3D.git
    • 若克隆速度慢,可使用 Gitee 镜像(国内速度更快):

      bash 复制代码
      git clone --recursive https://gitee.com/mirrors/Open3D.git
  3. 克隆完成后,进入源码根目录:

    bash 复制代码
    cd Open3D

创建编译目录(规范做法,分离源码与编译产物)

在 Open3D 源码根目录下,创建 build 文件夹(编译产物会存放在此,后续可直接删除清理):

cmd 复制代码
mkdir build && cd build

执行 CMake 命令生成工程

核心 CMake 命令格式(适配 Visual Studio 2022,64位),直接在 build 目录下执行:

cmd 复制代码
cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKE_INSTALL_PREFIX=E:\Open3D\install
  • ..:指定 CMake 配置的源码根目录(即 Open3D 源码的 CMakeLists.txt 所在路径);
  • -G "Visual Studio 17 2022":指定生成的工程文件适配 Visual Studio 2022(若用 VS2019,改为 -G "Visual Studio 16 2019");
  • -A x64:强制生成 64 位工程(Open3D 不支持 32 位,此参数必须加);
  • -DCMAKE_INSTALL_PREFIX:指定编译完成后 库的安装路径 (后续自己的 C++ 工程会引用此路径下的头文件和库文件,建议自定义绝对路径,如 E:\Open3D\install)。

出现依赖下载失败的情况,看下文依赖下载失败的通用解决方法这小节。

关键注意事项

  • 若 CMake 提示 找不到 Visual Studio,需检查 VS 是否安装了「使用C++的桌面开发」工作负载,或重启终端让环境变量生效;
  • Open3D 编译依赖库下载失败,网络环境限制导致无法正常访问 GitHub 下载,推荐「手动下载 + 校验 + 指定路径」的方案(彻底规避网络问题,适配所有受限环境);
  • 配置过程中会自动下载部分编译依赖,保持网络畅通,无红色报错即表示 CMake 配置成功。

依赖下载失败的通用解决方法

Open3D 编译依赖多个第三方库,若后续再遇到类似的SSL 下载失败 + 哈希不匹配错误,可直接复用本次的通用解决方案,步骤统一为:

  1. 从错误日志中提取3个关键信息:依赖库名 (如qhull)、版本号 (如v8.0.2)、标准SHA256值

  2. 删除3rdparty_downloads/依赖库名目录下的所有残留文件;

  3. 手动下载对应版本的官方源码包,校验SHA256值与标准值一致;

    bash 复制代码
    # 切换到文件所在目录
    # 执行PowerShell命令计算SHA256哈希(Windows自带,无需安装)
    #  文件名 'qhull-8.0.2.tar.gz'
    powershell -Command "Get-FileHash -Path 'qhull-8.0.2.tar.gz' -Algorithm SHA256"
  4. 将校验通过的文件放到3rdparty_downloads/依赖库名目录下,并修改名称v8.0.2.tar.gz

  5. 清理Build目录,重新执行CMake即可。

编译 Open3D 源码(Visual Studio 执行编译)

CMake 配置成功后,build 目录下会生成 Open3D.sln 解决方案文件,编译有两种方式(推荐方式1,更直观):

方式1:Visual Studio 图形界面编译

  1. 以管理员方式用对应版本的 Visual Studio 打开(如 VS2022) build/Open3D.sln

  2. 顶部菜单栏选择 编译配置

    • 调试版本:Debug + x64(开发调试用,带调试信息,运行速度稍慢);
    • 发布版本:Release + x64 (最终项目用,无调试信息,运行速度快);
      (建议先编译 Release 版本,日常开发足够,若需要调试再编译 Debug 版本);
  3. 右键点击解决方案资源管理器中的 INSTALL 项目 → 选择 生成 (核心!编译 INSTALL 会自动将头文件、库文件拷贝到 -DCMAKE_INSTALL_PREFIX 指定的安装路径);

    出现缺失依赖包下载缓慢的情况,看下文手动下载缺失依赖包的通用解决方法这小节。

  4. 等待编译完成:Open3D 源码较大,编译约10-30分钟(取决于电脑配置),输出窗口无红色报错、提示「生成成功」 即表示编译完成。

windows下可能出现出现以下错误:

修改对应代码位置就可以解决。

cpp 复制代码
return str(message[slice(0, cut_length, 1)]) + str("✄✄✄")
       + str(message[slice(-cut_length, static_cast<ssize_t>(len(message)), 1)]);
// 替换为
return str(message[slice(0, cut_length, 1)]) + str("cut_cut_cut" )+ str(message[slice(-cut_length, static_cast<ssize_t>(len(message)), 1)]);

方式2:命令行编译(无需打开 VS)

build 目录下打开 CMD/PowerShell,执行以下命令(直接编译 Release 版本):

cmd 复制代码
cmake --build . --config Release --target INSTALL -j8
  • --config Release:指定编译 Release 版本(改为 Debug 即编译调试版本);
  • --target INSTALL:编译并安装到指定路径;
  • -j8:指定 8 线程编译(根据自己电脑的 CPU 核心数调整,如 4 核写 -j4,加速编译)。

出现缺失依赖包下载缓慢的情况,看下文手动下载缺失依赖包的通用解决方法这小节。

输出窗口无红色报错 即表示编译完成。

windows下可能出现出现以下错误:

修改对应代码位置就可以解决。

cpp 复制代码
return str(message[slice(0, cut_length, 1)]) + str("✄✄✄")
       + str(message[slice(-cut_length, static_cast<ssize_t>(len(message)), 1)]);
// 替换为
return str(message[slice(0, cut_length, 1)]) + str("cut_cut_cut" )+ str(message[slice(-cut_length, static_cast<ssize_t>(len(message)), 1)]);

手动下载缺失依赖包的通用解决方法

核心问题仍是国内网络访问 GitHub/Codeload 的 HTTPS 资源不稳定,同样的Open3D 的所有第三方依赖均有固定下载地址和缓存目录,直接手动下载符合版本的压缩包放入指定目录,CMake 会自动跳过下载、直接验证并使用,无需修改任何配置。

解决方案和 "依赖下载失败的通用解决方法" 有异曲同工之处。

  1. 下载指定版本的依赖包(保留原格式,不要解压):打开浏览器,访问以下官方地址,下载对应压缩包。

    有些依赖包,需要看清楚是不是Windows系统的依赖包。

  2. 放入 Open3D 的依赖缓存目录(关键:路径必须完全匹配):Open3D 会将所有第三方依赖的下载缓存放在 源码根目录Open3D/3rdparty_downloads/ 下,按依赖名分文件夹 (与Open3D/3rdparty/下的文件夹同名,可能需要手动创建),将对应的压缩包(文件需重命名)放入。

    打开文佳夹时一般有已经开始自动下载但没下载完的包,将手动下载的包重命名(与自动下载的包名一致)并替换。有时候一个cmake中有多个URL链接,这个也可以作为一种参考,知道下载那个URL链接对应的包。

  3. 清除无效构建缓存(避免CMake读取旧错误信息): 进入build目录(如E:\Open3D\Open3D\build\)删除 _deps 文件夹(CMake的依赖构建临时缓存,删除后会重新生成,无任何影响)。

    建议所有依赖包都下载处理完以后,再删除文件夹以及后续的操作。假如还有位置错误,删除整个build重新来。

  4. 重新执行编译。

安装验证(编译产物检查)

编译完成后,进入第四步指定的安装路径(如 E:\Open3D\install),会自动生成 4 个核心文件夹,结构如下:

复制代码
E:\Open3D\install
├── include/  # 所有 Open3D C++ 头文件(如 Open3D/Visualization/Visualizer.h)
├── lib/      # 静态库(.lib)和动态库(.dll)文件
├── bin/      # 可执行文件依赖的动态库(.dll)
└── share/    # 配置文件、资源文件(无需关注)
  • 若缺少 includelib 文件夹,说明编译未执行 INSTALL 目标,返回重新编译 INSTALL 项目;
  • 此安装路径是后续自己的 C++ 工程引用 Open3D 的核心路径,务必记牢。

验证 Open3D 依赖(Visual Studio)

新建 C++ 工程并配置 Open3D 依赖,编译安装完成后,以 Visual Studio 2022 新建空项目 为例,快速配置 Open3D 依赖,编写第一个测试程序。

新建空项目

  1. VS2022 → 创建新项目 → 选择 空项目 → 项目命(如 Open3DTest)→ 选择位置(如 E:\Open3D) → 创建;
  2. 右键项目 → 添加 → 新建项 →命名C++ 文件(如 main.cpp)→添加 。

配置项目属性(核心,分Debug/Release)

右键项目 → 属性 → 配置属性,按以下步骤配置(注意配置平台为 x64,Debug 和 Release 版本需分别配置,路径一致):

  1. 配置包含目录(头文件路径)

    • 路径:C/C++ → 常规 → 附加包含目录

    • 添加:Open3D 安装路径下的 include 目录,如

      复制代码
      E:\Open3D\install\include
      E:\Open3D\install\include\open3d\3rdparty
    • 勾选「从父级或项目默认设置继承」。

  2. 配置库目录(.lib 文件路径)

    • 路径:链接器 → 常规 → 附加库目录

    • 添加:Open3D 安装路径下的 lib 目录,如

      复制代码
      E:\Open3D\install\lib
    • 勾选「继承自父项或项目默认值」。

  3. 配置附加依赖项(指定需要链接的 .lib 文件)

    • 路径:链接器 → 输入 → 附加依赖项

    • 添加 Open3D 核心库文件(Release 版本,Debug 版本库名后加 d,如 Open3Dd.lib):

      复制代码
      Open3D.lib
      Open3D_3rdparty_assimp.lib
      Open3D_3rdparty_blas_mkl_core.lib
      Open3D_3rdparty_blas_mkl_intel_ilp64.lib
      Open3D_3rdparty_blas_mkl_sequential.lib
      Open3D_3rdparty_blas_mkl_tbb_thread.lib
      Open3D_3rdparty_civetweb_civetweb.lib
      Open3D_3rdparty_civetweb_civetweb-cpp.lib
      Open3D_3rdparty_curl.lib
      Open3D_3rdparty_embree_embree_avx.lib
      Open3D_3rdparty_embree_embree_avx2.lib
      Open3D_3rdparty_embree_embree4.lib
      Open3D_3rdparty_embree_lexers.lib
      Open3D_3rdparty_embree_math.lib
      Open3D_3rdparty_embree_simd.lib
      Open3D_3rdparty_embree_sys.lib
      Open3D_3rdparty_embree_tasking.lib
      Open3D_3rdparty_filament_backend.lib
      Open3D_3rdparty_filament_bluegl.lib
      Open3D_3rdparty_filament_bluevk.lib
      Open3D_3rdparty_filament_filabridge.lib
      Open3D_3rdparty_filament_filaflat.lib
      Open3D_3rdparty_filament_filament.lib
      Open3D_3rdparty_filament_filameshio.lib
      Open3D_3rdparty_filament_geometry.lib
      Open3D_3rdparty_filament_ibl.lib
      Open3D_3rdparty_filament_image.lib
      Open3D_3rdparty_filament_ktxreader.lib
      Open3D_3rdparty_filament_meshoptimizer.lib
      Open3D_3rdparty_filament_smol-v.lib
      Open3D_3rdparty_filament_utils.lib
      Open3D_3rdparty_filament_vkshaders.lib
      Open3D_3rdparty_fmt.lib
      Open3D_3rdparty_glew.lib
      Open3D_3rdparty_glfw.lib
      Open3D_3rdparty_imgui.lib
      Open3D_3rdparty_ipp_ipp_iw.lib
      Open3D_3rdparty_ipp_ippccmt.lib
      Open3D_3rdparty_ipp_ippccmt_tl_tbb.lib
      Open3D_3rdparty_ipp_ippcoremt.lib
      Open3D_3rdparty_ipp_ippcoremt_tl_tbb.lib
      Open3D_3rdparty_ipp_ippcvmt.lib
      Open3D_3rdparty_ipp_ippcvmt_tl_tbb.lib
      Open3D_3rdparty_ipp_ippimt.lib
      Open3D_3rdparty_ipp_ippimt_tl_tbb.lib
      Open3D_3rdparty_ipp_ippsmt.lib
      Open3D_3rdparty_ipp_ippvmmt.lib
      Open3D_3rdparty_jpeg.lib
      Open3D_3rdparty_jsoncpp.lib
      Open3D_3rdparty_liblzf.lib
      Open3D_3rdparty_png.lib
      Open3D_3rdparty_qhull_r.lib
      Open3D_3rdparty_qhullcpp.lib
      Open3D_3rdparty_rply.lib
      Open3D_3rdparty_tinyfiledialogs.lib
      Open3D_3rdparty_uvatlas.lib
      Open3D_3rdparty_vtk_vtkCommonCore-9.1.lib
      Open3D_3rdparty_vtk_vtkCommonDataModel-9.1.lib
      Open3D_3rdparty_vtk_vtkCommonExecutionModel-9.1.lib
      Open3D_3rdparty_vtk_vtkCommonMath-9.1.lib
      Open3D_3rdparty_vtk_vtkCommonMisc-9.1.lib
      Open3D_3rdparty_vtk_vtkCommonSystem-9.1.lib
      Open3D_3rdparty_vtk_vtkCommonTransforms-9.1.lib
      Open3D_3rdparty_vtk_vtkFiltersCore-9.1.lib
      Open3D_3rdparty_vtk_vtkFiltersGeneral-9.1.lib
      Open3D_3rdparty_vtk_vtkFiltersModeling-9.1.lib
      Open3D_3rdparty_vtk_vtkFiltersSources-9.1.lib
      Open3D_3rdparty_vtk_vtkkissfft-9.1.lib
      Open3D_3rdparty_vtk_vtkpugixml-9.1.lib
      Open3D_3rdparty_vtk_vtksys-9.1.lib
      Open3D_3rdparty_webrtc_webrtc.lib
      Open3D_3rdparty_webrtc_webrtc_extra.lib
      Open3D_3rdparty_zeromq.lib
      Open3D_3rdparty_zlib.lib
      tbb12.lib
      opengl32.lib

      opengl32.lib是 Windows 系统提供的标准 OpenGL 库,所有依赖 OpenGL 的程序都需要链接它。

    • 勾选「继承自父项或项目默认值」。

  4. 统一运行时库配置,MT是静态链接运行时库,MD是动态链接运行时库,两者不能混合使用。

    • 右键项目「Open3DTest」→「属性」→「C/C++」→「代码生成」;
    • 找到「运行库」,下拉选择「多线程 (/MT)」(与 Open3D 一致);
    • 点击「确定」保存设置。

    与 Open3D 一致验证:同理查看 Open3D 的「属性」→「C/C++」→「代码生成」→「运行库」;

  5. 将项目编译标准改为 C++17(必做),Open3D 0.19.0 版本深度依赖 C++17 特性,必须将项目的 C++ 语言标准设置为 C++17。

    • 右键项目「Open3DTest」→「属性」→「C/C++」→「语言」;
    • 找到「C++ 语言标准」,下拉选择「ISO C++17 标准 (/std:c++17)」;
    • 点击「确定」保存设置。
  6. (可选)配置动态库路径(避免运行时找不到 .dll),Open3D 的 .dll 文件在 install/bin 目录下,运行程序时需要加载,有3种方式:

    • install/bin 下的所有 .dll 文件复制到自己项目的 可执行文件输出目录 (如 x64/Release);
    • D:\Open3D\install\bin 添加到 系统环境变量 Path(永久生效,推荐);
    • VS 项目属性 → 调试 → 环境 → 添加 PATH=E:\Open3D\install\bin;%PATH%(仅当前项目生效)。

编写测试代码(验证配置成功)

main.cpp 中写入以下代码(创建一个点云并可视化,核心功能验证):

cpp 复制代码
#include <Open3D/Open3D.h>
#include <Open3D/Visualization/visualizer/Visualizer.h>

int main() {
    // 创建一个空的点云对象
    auto pcd = std::make_shared<open3d::geometry::PointCloud>();
    // 添加3个点(x, y, z)
    pcd->points_.emplace_back(0.0, 0.0, 0.0);
    pcd->points_.emplace_back(1.0, 0.0, 0.0);
    pcd->points_.emplace_back(0.0, 1.0, 0.0);
    // 给点云设置颜色(红色)
    pcd->colors_.emplace_back(1.0, 0.0, 0.0);
    pcd->colors_.emplace_back(1.0, 0.0, 0.0);
    pcd->colors_.emplace_back(1.0, 0.0, 0.0);

    // 可视化点云
    open3d::visualization::Visualizer vis;
    vis.CreateVisualizerWindow("Open3D Test", 800, 600);
    vis.AddGeometry(pcd);
    vis.Run();
    vis.DestroyVisualizerWindow();

    return 0;
}

运行测试程序

  1. 顶部菜单栏选择 Release + x64
  2. 点击「本地Windows调试器」或按 F5 运行;
  3. 若弹出可视化窗口,显示3个红色点,说明 Open3D 编译、配置全部成功

总结

详细讲解了从环境准备、源码获取到编译安装、工程配置的全流程步骤,适配最新版 Open3D 源码,兼容 Visual Studio 2019/2022(64位)。

相关推荐
不染尘.2 小时前
二叉树相关题目
开发语言·数据结构·c++·算法
女王大人万岁2 小时前
Go标准库 sync 详解
服务器·开发语言·后端·golang
qq_411262422 小时前
短时间串口发送网络端怎么接收不到
开发语言·php
静谧空间2 小时前
java登录验证码CaptchaConfig
java·开发语言
小高Baby@2 小时前
session、cookie、Jwt-token
开发语言·后端·golang
露天赏雪2 小时前
JDK8 的入门避坑指南
java·服务器·windows·spring boot·后端·spring·性能优化
maplewen.2 小时前
C++11 std::mutex
开发语言·c++
jiaguangqingpanda2 小时前
Day37-20260205
java·开发语言
历程里程碑2 小时前
21:重谈重定义理解一切皆“文件“及缓存区
linux·c语言·开发语言·数据结构·c++·算法·缓存