如何在visual studio 2019的IDE下配置CGAL
写在前面:
CGAL的配置官方文档https://doc.cgal.org/latest/Manual/windows.html,照着官方文档尝试了一下,在第一种方法中:vcpkg install cgal的过程中有一个bug:yasm_tool:X64-widows安装失败,实在是没有办法解决了,官方提到的那个bug是x86的yasm_tool,应该是被修复了;第二种方法中,尝试使用cmake对最新版本的CGAL进行编译,但是在build的的过程中失败了!我头大了!最新版本的CGAL好像是更改了它的文档存储方式,我退到了更早版本的cgal进行了尝试 ,终于成功了!
概述
CGAL的安装主要是两个步骤:配置好CGAL的依赖库,主要是三个:boost(这个不知道是干啥的),gmp以及mpfr(这两个应该是和浮点数的精度控制有关的);第二步是编译和连接CGAL。
配置依赖库
boost的源码地址在这里,下载并且运行boost_1_77_0-msvc-XX.Y-64.exe这个程序,其中XX.Y = 14.0是配合VC 2015, XX.Y = 14.1是配合VC 2017, XX.Y = 14.2是配合VC 2019的。
运行的界面,可以修改安装的位置,点击next就开始配置了
点击finish完成安装
安装后的条目大概是这样,然后需要修改电脑的环境变量(右键我的电脑,属性,高级设置,环境变量)
需要添加两个环境变量和一条path(这个变量是电脑里原来就有的):
- BOOST_LIBRARYDIR:D:\compile\boost_1_71_0\lib64-msvc-14.2(lib64-msvc-14.2所在的路径)
- BOOST_INCLUDEDIR:D:\compile\boost_1_71_0(boost_1_71_0所在的路径)
- PATH:D:\compile\boost_1_71_0\lib64-msvc-14.2(lib64-msvc-14.2所在的路径)
这里添加的变量值是指的路径,并不是大家一定要填一样的。这些变量的添加是为了后续的CGAL的编译以及使用方便。gmp以及mpfr这两个必须的依赖库是直接包含在CGAL中的,可以不用另行添加。
编译CGAL
CGAL的源码在这里,因为我在编译最新版本的CGAL时出了些问题,所以我下载了之前的版本。下载并运行CGAL-4.12-beta1-Setup.exe。
点击next
点击I agree
点击next
选择64位,点击next
选择安装的文件夹,点击next
点击install
装好了大概有这样的内容,build是cmake之后生成的。我是用的是cmake的gui进行处理的
标记的地方是需要添加的内容,上面一个是安装cgal的根目录路径,下面一个是cmake生成的文件的保存路径,填好了点击configure
点击finish
点击generate,cmake部分的工作就完成了,打开刚才的bulid文件夹
找到CGAL.sln,双击打开
右键ALL BUILD,点击生成即可。
test
配置好环境后,需要在新建的项目文件的属性,VC++目录的的包含目录中添加:
- D:\local\boost_1_71_0(安装boost_1_71_0的目录)
- D:\compile\cgal\auxiliary\gmp\include(gmp的include目录,这个在安装CGAL的auxiliary目录下找)
- D:\compile\cgal\include(CGAL的include目录)
- D:\compile\cgal\build\include\CGAL(编译生成CGAL的include目录)
在VC++目录的的库目录中添加:
- D:\compile\cgal\build\lib(编译生成CGAL的库目录)
- D:\compile\cgal\auxiliary\gmp\lib(gmp的库目录)
- D:\local\boost_1_71_0\libs(boost的库目录)
在链接器的输入中添加:
- libgmp-10.lib
- libmpfr-4.lib
- kernel32.lib
- user32.lib
- CGAL_Core-vc140-mt-gd-4.11.lib
- CGAL_ImageIO-vc140-mt-gd-4.11.lib
- CGAL-vc140-mt-gd-4.11.lib
#include <iostream>
#include<CGAL/Simple_cartesian.h>
#include<CGAL/Exact_predicates_exact_constructions_kernel.h>
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;;
//typedef CGAL::Simple_cartesian<double> Kernel;
//笛卡尔坐标系下的对象
typedef Kernel::Point_2 Point_2;
//顶点
typedef Kernel::Segment_2 Segment_2;
//直线
int main()
{
Point_2 p(0, 0.3), q, r(2, 0.9);
{
q = Point_2(1, 0.6);
std::cout << (CGAL::collinear(p, q, r) ? "collinear\n" : "not collinear\n");
}
{
std::istringstream input("0 0.3 1 0.6 2 0.9");
input >> p >> q >> r;
std::cout << (CGAL::collinear(p, q, r) ? "collinear\n" : "not collinear\n");
}
{
q = CGAL::midpoint(p, r);
std::cout << (CGAL::collinear(p, q, r) ? "collinear\n" : "not collinear\n");
}
//amazing part for rounding
//test co-planer
/*{
Point_2 p(0, 0.3), q(1, 0.6), r(2, 0.9);
std::cout << (CGAL::collinear(p, q, r) ? "collinear\n" : "not collinear\n");
}
{
Point_2 p(0, 1.0 / 3.0), q(1, 2.0 / 3.0), r(2, 1);
std::cout << (CGAL::collinear(p, q, r) ? "collinear\n" : "not collinear\n");
}
{
Point_2 p(0, 0), q(1, 1), r(2, 2);
std::cout << (CGAL::collinear(p, q, r) ? "collinear\n" : "not collinear\n");
}*/
//simple test to learn CGAL
/*Point_2 p(1, 1), q(10, 10);
std::cout << "p = " << p << std::endl;
std::cout << "q = " << q.x() << " " << q.y() << std::endl;
//输出点的坐标,以及访问顶点的两种方式
std::cout << "sqdist(p,q) = "
<< CGAL::squared_distance(p, q) << std::endl;
//输出两个顶点的距离的平方
Segment_2 s(p, q);
Point_2 m(5, 9);
std::cout << "m = " << m << std::endl;
std::cout << "sqdist(Segment_2(p,q), m) = "
<< CGAL::squared_distance(s, m) << std::endl;
std::cout << "p, q, and m ";
switch (CGAL::orientation(p, q, m)) {
case CGAL::COLLINEAR:
std::cout << "are collinear\n";
break;
case CGAL::LEFT_TURN:
std::cout << "make a left turn\n";
break;
case CGAL::RIGHT_TURN:
std::cout << "make a right turn\n";
break;
}
std::cout << " midpoint(p,q) = " << CGAL::midpoint(p, q) << std::endl;*/
return 0;
}
这是CGAL的一段测试代码,运行时需要在项目文件中添加:
- CGAL_Core-vc140-mt-gd-4.11.dll
- CGAL_ImageIO-vc140-mt-gd-4.11.dll
- CGAL-vc140-mt-gd-4.11.dll
三个.dll的文件,这个要在 D:\compile\cgal\build\lib(编译生成CGAL的库目录)中找到。祝你成功!