最近要把一个matlab的代码转到c++,其中用到了pcl库,并且要在windowns下运行,于是将配置过程记录下来供以后参考。
方案选择
要转换的matlab代码里面需要使用PCL库和g2o的库,看网上都说vcpkg好,于是我选用vcpkg+visual studio的方案。
vcpkg环境配置
首先安装vcpkg,参考https://github.com/microsoft/vcpkg。
之后安装我需要的eigen库、vtk库、pcl库、g2o库以及xlnt库
eigen库
cd c:\src\vcpkg
.\vcpkg.exe install eigen3
vtk库
.\vcpkg.exe install vtk[core,opengl]
PCL库
.\vcpkg.exe install pcl[core,vtk,visualization,opengl]
g2o库
.\vcpkg.exe install g2o
xlnt库
.\vcpkg.exe install xlnt
这里有2个坑:
1、最开始我只安装了pcl[core],然后加入pcl的可视化头文件后编译报错找不到<pcl/visualization/pcl_visualizer.h>,于是搜了一下,发现需要安装[vtk、visualization]这些feature才能运行,另外vcpkg默认安装的都是x86版本的库。
2、代码需要复现matlab的plot函数,网上搜了一下,发现pcl里面的pcl::visualization::PCLPlotter正好可以实现我想要的功能,于是copy了网上的代码,发现报错:Error: no override found for ‘vtkContextDevice2D’.,代码死在了this->Context->GetDevice()->SetViewportSize(vtkVector2i(size));,网上一搜,发现需要加入两行代码:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingContextOpenGL2)
但是,加入后编译报错了,于是又在网上搜,发现其他人在ubuntu下编译vtk时需要配置选项,我感觉应该是vtk的feature少安装了,于是安装了pcl[opengl]和vtk[opengl],安装后编译通过了,之前的报错也没有了,可以正常地plot了。
visual studio cmake工程建立
因为后续有跨平台的需求,因此选择建立cmake工程。
之后修改一下工程的编译环境,visual studio默认x64的编译环境,我们需要改成x86才能使用上一步安装的库。
然后编写CMakeList.txt,如下:
cmake_minimum_required (VERSION 3.8)
set(CMAKE_TOOLCHAIN_FILE C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake)
set(CMAKE_CXX_STANDARD 17)
find_package(Eigen3 CONFIG REQUIRED)
find_package(PCL CONFIG REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
find_package(Xlnt CONFIG REQUIRED)
find_package(g2o CONFIG REQUIRED)
#find_package(VTK REQUIRED)
#include("${VTK_USE_FILE}")
# 将源代码添加到此项目的可执行文件。
add_executable (vstest "vstest.cpp" "vstest.h" "pgo.cpp" "pgo.hpp")
#target_link_libraries(vstest Eigen3::Eigen ${PCL_LIBRARIES} ${VTK_LIBRARIES} xlnt::xlnt)
target_link_libraries(vstest Eigen3::Eigen ${PCL_LIBRARIES} xlnt::xlnt)
target_link_libraries(vstest g2o::core g2o::stuff g2o::types_icp g2o::types_sba)
其中下面这一句很关键,要加上才能找到vcpkg安装的库
set(CMAKE_TOOLCHAIN_FILE C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake)
之后就可以在需要用库的地方include需要的头文件就可以了。
#include <Eigen/Dense>
#include <deque>
#include <vector>
#include <string>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/pcl_plotter.h>
#include <pcl/common/transforms.h>
#include <pcl/io/io.h>
#include <g2o/types/slam3d/types_slam3d.h>
#include <g2o/core/block_solver.h>
#include <g2o/core/optimization_algorithm_levenberg.h>
#include <g2o/solvers/eigen/linear_solver_eigen.h>
#include <memory>
#include <io.h>
#include <direct.h>
#include <xlnt/xlnt.hpp>
#include <iostream>
#include <cmath>
#include <vtkAutoInit.h>
另外,之前visual studio用的不多,记录一个小坑。
有时代码会出现abort() has been called的错误弹窗,发现是eigen导致的,错误原因参考http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html,需要把c++版本改为c++17
set(CMAKE_CXX_STANDARD 17)