CGAL5.1编译记录

PCL提供的ICP算法使用效果不太满意,尝试使用CGAL的super 4PCS配准方法。先配置环境编译CGAL,把过程记录下来,主要参考了这一篇
环境是win7+vs2017。

一、准备:

  1. 从官网下载CGAL源码,地址https://www.cgal.org/。这里下载最新版5.1.
  2. 下载Eigen并解压,地址:Eigen官网。这里下载最新版3.3.8。
  3. 还有一些其他的依赖,之前已经安装过了,有CMake,Zlib1.2.11,Boost1.73.0。

二、添加环境变量:

添加BOOST_INCLUDEDIR : E:\boost_1_73_0。
添加BOOST_LIBRARYDIR : E:\boost_1_73_0\stage\lib。
path添加CGAL的路径:;D:\dev\CGAL-5.1\auxiliary\gmp\lib。
还添加了一个Qt : D:\Qt\Qt5.14.1。不过这个值好像并不对。

三、CMAKE编译

用CMake编译CGAL,设置源代码路径和输出路径。configure。
configure之后做了几处改动:把Ungrouped entries里的Qt5_DIR设置为D:\Qt\Qt5.14.1\5.14.1\msvc2017_64\lib\cmake\Qt5;WITH 里勾上 WITH demos 和 WITH examples,有例子更容易验证安装是否成功;Zlib设置:在这里插入图片描述
点击Generate,但是无法识别到eigen路径,于是手动编辑eigen的值到源代码解压路径E:\eigen-3.3.8。再次generate成功。

四、生成项目

打开cmake出来的sln项目,release和debug模式下分别生成ALL_BUILD,成功。在这里插入图片描述
运行example项目,以 Surface mesh 为例,打开 D:\dev\CGAL-5.1\build\examples\Surface_mesh\Surface_mesh_Examples.sln,将draw_surface_mesh设为启动项目,先在debug模式下生成:
在这里插入图片描述
再在release模式下生成:
在这里插入图片描述
运行项目:
在这里插入图片描述
找到这个文件,把该文件夹下的所有dll文件拷贝到build出来的工程文件里的debug和release目录下,并把data/elephant.off这几个文件也拷贝到debug和release目录下,debug运行:
在这里插入图片描述
release运行会闪退?程序“[13292] draw_surface_mesh.exe”已退出,返回值为 1073741845 (0x40000015)。看控制台输出好像是因为缺少qt支持。

五、新建项目引用CGAL

主要参考:这篇文章,决定修改下cmake的设定。取消勾选CGAL_HEADER_ONLY,把cmake_install_prefix改成build文件夹,重新configure,generate,生成all_build。
系统环境变量的PATH添加:;D:\dev\CGAL-5.1\build\bin;E:\boost_1_73_0\stage\lib
新建一个win32控制台应用程序,测试CGAL环境是否可以使用。
代码:

#include "stdafx.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/self_intersections.h>
#include <fstream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Surface_mesh<K::Point_3>             Mesh;
typedef boost::graph_traits<Mesh>::face_descriptor face_descriptor;
namespace PMP = CGAL::Polygon_mesh_processing;
int main(int argc, char* argv[])
{
	const char* filename = (argc > 1) ? argv[1] : "D:/dev/CGAL-5.1/data/pig.off";
	// 样例路径在你安装的cgal的examples文件夹下面
	std::ifstream input(filename);
	Mesh mesh;

	if (!input || !(input >> mesh) || !CGAL::is_triangle_mesh(mesh))
	{
		std::cerr << "Not a valid input file." << std::endl;
		getchar();
		return 1;
	}

	bool intersecting = PMP::does_self_intersect(mesh,
		PMP::parameters::vertex_point_map(get(CGAL::vertex_point, mesh)));
	std::cout
		<< (intersecting ? "There are self-intersections." : "There is no self-intersection.")
		<< std::endl;
	std::vector<std::pair<face_descriptor, face_descriptor> > intersected_tris;
	PMP::self_intersections(mesh, std::back_inserter(intersected_tris));
	std::cout << intersected_tris.size() << " pairs of triangles intersect." << std::endl;
	getchar();
	return 0;
}

包含目录:
在这里插入图片描述
库目录:
在这里插入图片描述
附加依赖项:
在这里插入图片描述
显示结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值