由于当前的 vcpkg 还未增加对 open3d 包的管理支持,也就是使用 vcpkg install open3d 无效,因此本人尝试将 open3d 官方已经编译好的源码直接移植到 vcpkg 中。
1. 下载 open3d 已经编译好的源码![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a4ef2d7881c5b54bde933190160fab65.png)
从官网同时下载 Release 版和 Debug 版。
2. 移植 Release 包
解压 Release 包后,将 bin、include、lib 文件夹中的文件对应拷贝到 vcpkg(installed/x64-windows) 中。
3. 移植 Debug 包
解压 Debug 包后,将 bin、lib 文件夹中的文件对应拷贝到 vcpkg(installed/x64-windows/debug) 中。
4. 移植 cmake 文件
在 vcpkg 的 install/x64-windows/share 路径下创建一个名为 open3d 的文件夹,将 Release 包和 Debug 包的 CMake 文件夹中文件按图中方式拷贝到 open3d 文件夹中。
拷贝后的 open3d 文件夹中包含以下文件
Open3DConfig.cmake
Open3DConfigVersion.cmake
Open3DTargets-debug.cmake
Open3DTargets-release.cmake
Open3DTargets.cmake
5. 修改 Open3DConfig.cmake 文件
将原本第 6 行的代码
get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../" ABSOLUTE)
修改为
get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../" ABSOLUTE)
6. 修改 Open3DTargets-debug.cmake 文件
将文件中含有 ${_IMPORT_PREFIX} 变量处的后面都加上 /debug 字符,包括 11、12、16行。
修改前
11 IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/lib/Open3D.lib"
12 IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/bin/Open3D.dll"
16 list(APPEND _cmake_import_check_files_for_Open3D::Open3D "${_IMPORT_PREFIX}/lib/Open3D.lib" "${_IMPORT_PREFIX}/bin/Open3D.dll" )
修改后
11 IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/debug/lib/Open3D.lib"
12 IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/debug/bin/Open3D.dll"
16 list(APPEND _cmake_import_check_files_for_Open3D::Open3D "${_IMPORT_PREFIX}/debug/lib/Open3D.lib" "${_IMPORT_PREFIX}/debug/bin/Open3D.dll" )
7. 修改 Open3DTargets.cmake 文件
在 51 行后重复增加一句
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
修改前
49 # Compute the installation prefix relative to this file.
50 get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
51 get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
52
53 if(_IMPORT_PREFIX STREQUAL "/")
54 set(_IMPORT_PREFIX "")
55 endif()
修改后
49 # Compute the installation prefix relative to this file.
50 get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
51 get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
52 get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
53
54 if(_IMPORT_PREFIX STREQUAL "/")
55 set(_IMPORT_PREFIX "")
56 endif()
!!!至此大功告成!!!
使用 cmake 工程进行测试
CMakeList.txt(需要将 CMAKE_TOOLCHAIN_FILE 指定为你自己 vcpkg 的安装路径)
cmake_minimum_required(VERSION 3.0.0)
set( CMAKE_TOOLCHAIN_FILE
"C:/ProgramData/vcpkg/scripts/buildsystems/vcpkg.cmake" # 此处需要根据实际安装位置修改
CACHE STRING
"Vcpkg toolchain file")
set( CMAKE_BUILD_TYPE
"Release"
CACHE STRING
""
FORCE)
project(test VERSION 0.1.0)
add_executable(${PROJECT_NAME})
target_sources(${PROJECT_NAME} PRIVATE main.cpp)
# Open3D
option(STATIC_WINDOWS_RUNTIME "Use static (MT/MTd) Windows runtime" ON )
if(STATIC_WINDOWS_RUNTIME)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
else()
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
endif()
find_package(Open3D REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Open3D::Open3D)
get_target_property(open3d_type Open3D::Open3D TYPE)
if(open3d_type STREQUAL "SHARED_LIBRARY")
message(STATUS "Copying Open3D.dll to ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
# COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_INSTALL_PREFIX}/bin/Open3D.dll ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_RUNTIME_DLLS:${PROJECT_NAME}> "$<TARGET_FILE_DIR:${PROJECT_NAME}>" COMMAND_EXPAND_LISTS)
endif()
main.cpp
#include <string>
#include "open3d/Open3D.h"
int main(int, char**) {
std::cout << "Hello, world!\n";
auto sphere = open3d::geometry::TriangleMesh::CreateSphere(1.0);
sphere->ComputeVertexNormals();
sphere->PaintUniformColor({0.0, 1.0, 0.0});
open3d::visualization::DrawGeometries({sphere});
}