文章目录
前言
首先不建议windows下源码编译,需要用C++的可以直接下载官网编译好的版本。熟悉vcpkg的,可以把open3d加到vcpkg使用,参考该博客。
1.编译环境
- cmake >=3.20
- python >=3.6.0
- visual studio >=2017
2.编译步骤
- Github下载open3d源码
- 打开源码,新建build文件夹
mkdir build
cd build
cmake -G"Visual Studio 16 2019"-A x64 -DCMAKE_INSTALL_PREFIX="<open3d_install_directory>"..
填写你的VS版本,例vs2022(17),open3d_install_directory使用当前路径".",最终命令为:
cmake -G"Visual Studio 17 2022"-A x64 -DCMAKE_INSTALL_PREFIX="."..
- 编译,会出现一系列错误,按照提示解决。重复编译过程直至没有Error提示
cmake --build.--config Release --target ALL_BUILD
- 安装,生成include和lib
cmake --build.--config Release --target INSTALL
3.编译中的bug
3.1 下载超时问题,ispc、pybind11、open3d_sphinx_theme等
报错信息类似:
error : downloading 'https://github.com/xxx/'
- 开vpn手动点击报错链接中的url用浏览器下载,然后复制粘贴到"Open3D-master\3rdparty_downloads"相应的库文件下。
- 替换相应文件下的未下载完成的文件,例如:下载pybind11-2.6.2.tar.gz改名替换为Open3D-master\3rdparty_downloads\pybind11\v2.6.2.tar.gz。
- one-20190522.tar.gz 是parallelstl库下的文件 -> 20190522.tar.gz
- 建议先把boringssl、curl这两个库替换好,curl是下载用的库。下好后可能以上的超时问题会消失一些,博主本人是一个个替换的,最后才根据cmake报错装的curl
3.2 boringssl
这个库的下载路径不存在,所以需要去GitHub下载boringssl-master.zip
- 解压后用7z压成.tar
- 把.tar压成gzip
- 把boringssl-master.tar.gz改名替换boringssl_edfe413_win_amd64.tar.gz
3.3 DirectXMath、DirectXHeaders
fatal: unable to access 'https://github.com/microsoft/DirectXMath.git/': Failed to connect to github.com port 443 aft
er 21085 ms: Timed out
博主的 curl 下载并编译好后,会自动下载装好。上述方法不行试试,github下载了DirectX-Headers-mains和DirectXMath-main,并解压到build\uvatlas\src\ext_directxheaders和build\uvatlas\src\ext_directxmath
4.验证编译是否成功
随便打开build\bin\examples\Release\下的例程,例如:Draw.exe
5.新建项目中使用
PS:3d库都是缝合怪
新建一个C++项目
- 包含Build下的include、include\open3d\3rdparty
- 打开build/open3d.sln 找到 example/cpp中的任意一个项目 - 库目录添加build\bin\Release路径,然后照抄范例中的附加目录- 照抄范例的预处理器,不然会报错fmn重复定义(LNK2005) 等错误
- 项目需Release-x64的项目,Debug需要重编译
- 项目->属性->c/c++代码生成 更改成 “多线程(/MT)”
插入如下代码:
#include<iostream>#include"open3d/Open3D.h"usingnamespace open3d;intmain(){// 从github上下载pcd文件,也可以自己找一个pcd文件auto demo_crop_data = data::DemoCropPointCloud();auto cloud_ptr = std::make_shared<geometry::PointCloud>();if(io::ReadPointCloud(demo_crop_data.GetPointCloudPath(),*cloud_ptr)){
utility::LogInfo("Successfully read {}",demo_crop_data.GetPointCloudPath());}else{
utility::LogWarning("Failed to read {}",demo_crop_data.GetPointCloudPath());return1;}
cloud_ptr->NormalizeNormals();
visualization::DrawGeometries({ cloud_ptr },"PointCloud",1600,900);}
6.静态库整合
上面链接的静态库太多,故使用visual studio工具lib.exe(官方文档)进行合并,简化调用流程。由于lib.exe的合并的函数限制,把上面的的静态链接库按照体积分两份。
6.1 Lib.exe简单使用
输入cmd命令
lib.exe /out:xmv1.lib Open3D.lib assimp-vc143-mt.lib 等
可以用python处理之前的链接路径,最后得到所有链接路径(绝对路径)。还没看懂的可以去看看这篇博客。
最后多个静态链接合并成xmv1.lib和xmv.lib
6.2 简化后的调用流程
- 添加头文件,包含build下的include、include\open3d\3rdparty
D:\3rdparty\Open3D-master\build\includeD:\3rdparty\Open3D-master\build\include\open3d\3rdparty
- 引用链接库
#pragmacomment(lib,"xmv.lib")#pragmacomment(lib,"xmv1.lib")
- 添加预处理器
%(PreprocessorDefinitions)WIN32_WINDOWS_CRT_SECURE_NO_WARNINGSNDEBUGOPEN3D_CXX_STANDARD="14"OPEN3D_CXX_COMPILER_ID="MSVC"OPEN3D_CXX_COMPILER_VERSION="19.34.31933.0"OPEN3D_CUDA_COMPILER_ID=""OPEN3D_CUDA_COMPILER_VERSION=""ZMQ_STATICBUILD_ISPC_MODULEBUILD_GUIBUILD_WEBRTCWITH_IPPICV_GLIBCXX_USE_CXX11_ABI=0WINDOWS_CRT_SECURE_NO_DEPRECATE_CRT_NONSTDC_NO_DEPRECATE_SCL_SECURE_NO_WARNINGSNOMINMAX_USE_MATH_DEFINES_ENABLE_EXTENDED_ALIGNED_STORAGE__TBB_LIB_NAME=tbb_staticOPEN3D_STATICGLEW_STATICFMT_HEADER_ONLY=0FMT_USE_WINDOWS_H=0FMT_STRING_ALIAS=1TINYGLTF_IMPLEMENTATIONSTB_IMAGE_IMPLEMENTATIONSTB_IMAGE_WRITE_IMPLEMENTATIONTINYOBJLOADER_IMPLEMENTATIONMKL_ILP64CMAKE_INTDIR="Release"
- 调用代码
#include<iostream>#pragmacomment(lib,"xmv.lib")#pragmacomment(lib,"xmv1.lib")#include"open3d/Open3D.h"usingnamespace open3d;intmain(){auto demo_crop_data = data::DemoCropPointCloud();auto cloud_ptr = std::make_shared<geometry::PointCloud>();if(io::ReadPointCloud(demo_crop_data.GetPointCloudPath(),*cloud_ptr)){ utility::LogInfo("Successfully read {}",demo_crop_data.GetPointCloudPath());}else{ utility::LogWarning("Failed to read {}",demo_crop_data.GetPointCloudPath());return1;}auto redWoodRGBD = data::SampleRedwoodRGBDImages();auto image_ptr = std::make_shared<geometry::Image>();if(io::ReadImage(redWoodRGBD.GetColorPaths()[0],*image_ptr)){ utility::LogInfo("Successfully read {}",redWoodRGBD.GetColorPaths()[0]);}else{ utility::LogWarning("Failed to read {}",redWoodRGBD.GetColorPaths()[0]);return1;}}
版权归原作者 观鱼碧潭上 所有, 如有侵权,请联系我们删除。