Windows 下安装 CGAL 并验证安装
安装过程完全参考官方文档:https://doc.cgal.org/latest/Manual/windows.html
本次安装环境:windows 10 1909 - 家庭中文版
、VS2017 Community
安装方式:选用文档中的第一种,Installing CGAL with the Vcpkg Library Manager
1. 安装 Vcpkg
github 地址:https://github.com/microsoft/vcpkg
正常(理想)的安装过程:
C:\dev> git clone https://github.com/microsoft/vcpkg
C:\dev> cd vcpkg
C:\dev\vcpkg> .\bootstrap-vcpkg.bat
遇到如下问题:https://github.com/microsoft/vcpkg/issues/3825
Could not find Visual Studio. VS2015 or VS2017 (with C ...
解决方法:换用 cmd 运行,不使用 Power Shell 运行,可能是 Power Shell 配置有些问题。
2. 使用 Vcpkg 安装 CGAL
2.1 正常(理想)的安装过程
C:\dev\vcpkg> ./vcpkg.exe install cgal
2.2 遇到的问题及解决方法
使用 vcpkg 会逐个安装依赖,可能需要下载很多应用,出现很多问题。除去网络的问题,一整套流程下来,download、build 仍然需要比较久的时间,需要耐心等待。
问题1:下载依赖的应用太慢
Downloading xxx... // 然后就一直不动了
每次下载不动的时候,可以手动下载,然后放到它需要的目录下(xx/vcpkg/downloads/)
解决方法参考 - https://blog.csdn.net/qq_39690181/article/details/82910610
问题2:错误提醒,vs 缺少英语 pack
Warning: The following VS instances are excluded because the English language pack.
使用 Visual Studio Installer -> 修改 -> 语言包 -> 英语,勾选后安装即可。
解决方法参考 - https://blog.csdn.net/sdsabc2000/article/details/80049622
问题3:boost license 文件下载不了
Downloading https://raw.githubusercontent.com/boostorg/boost/boost-1.72.0/LICENSE_1_0.txt... Failed. Status: 6;"Could
n't resolve host name
手动是可以打开下载该文件的,只是下载后不知道放在哪里,所以这个问题和问题1不太一样。
相关的 github issue:https://github.com/microsoft/vcpkg/issues/11005
解决方法:过一会儿再下载,可能是网络状况问题。我在换用校园网后下载成功了。这类问题在安装过程中一直出现,多执行几次命令,或者换一个网络环境再试一试。
总结:大部分是网络问题,能手动下载的可以手动下载,否则可以换个网络环境,多执行几次脚本。
最后安装成功的截图:(总共花费了差不多 30 min)
3. 编译例子验证 CGAL 安装
3.1 添加 CGAL 到项目包含目录
在 VS 中新建 Visual C++ 空项目,在解决方案资源管理器中,右键项目属性,打开属性页:
- 配置属性 -> VC++ 目录 -> 包含目录 -> 编辑,
- 添加上刚刚安装的 CGAL 目录:
YOUR_INSTALL_DIR\vcpkg\installed\x86-windows\include
,如下图
要注意,属性页的配置和平台选项(属性页最上方)需要和工具栏中的一致,图中均为:Debug - x64
。
3.2 编写程序并运行
这里的代码使用参考官方文档中的 Hellow World
:https://doc.cgal.org/latest/Manual/tutorial_hello_world.html
项目中添加新建项,粘贴下列代码:
#include <iostream>
#include <CGAL/Simple_cartesian.h>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;
int main()
{
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;
}
3.3 查看运行结果
编译运行,可以得到如下输出:
这时 CGAL 应该是安装成功了。
4. 为 CGAL 添加可选的第三方依赖 - 安装 Eigen 库
这里主要以安装 Eigen 为例。当使用 CGAL 运行例子时,大部分可以正常运行,而有些需要额外库的支持,如,在 Point Set Processing Package 中,运行法向估计例子时,产生以下错误:
error C4996: 'CGAL::Diagonalize_traits<FT,3>::diagonalize_selfadjoint_covariance_matrix': CGAL::Diagonalize_traits is a deprecated class that can lead to precision issues, please use CGAL::Eigen_diagonalize_traits
是说 CGAL::Diagonalize_traits
已经弃用,需要使用 CGAL::Eigen_diagonalize_traits
来代替。查阅资料,并且分析库文件得知,安装 Eigen 库后,可以解决这个问题。
4.1 使用 Vcpkg库安装 Eigen
.\vcpkg.exe install eigen3
使用 Vcpkg 可以很容易安装 Eigen,之后在使用 VS2017 编译时,由于 Eigen 已经存在,编译时会使用 CGAL::Eigen_diagonalize_traits
,上述问题解决。
然而会出现新的问题:
main.obj : error LNK2019: 无法解析的外部符号 __gmpq_clear,该符号在函数 "public: __cdecl CGAL::Gmpq_rep::~Gmpq_rep(void)" (??1Gmpq_rep@CGAL@@QEAA@XZ) 中被引用
main.obj : error LNK2019: 无法解析的外部符号 __gmpq_equal,该符号在函数 "public: bool __cdecl CGAL::Gmpq::operator==(class CGAL::Gmpq const &)const " (??8Gmpq@CGAL@@QEBA_NAEBV01@@Z) 中被引用
main.obj : error LNK2019: 无法解析的外部符号 __gmpq_init,该符号在函数 "public: __cdecl CGAL::Gmpq_rep::Gmpq_rep(void)" (??0Gmpq_rep@CGAL@@QEAA@XZ) 中被引用main.obj : error LNK2019: 无法解析的外部符号 __gmpq_set_d,该符号在函数 "public: __cdecl CGAL::Gmpq::Gmpq(double)" (??0Gmpq@CGAL@@QEAA@N@Z) 中被引用
C:\Users\15651\source\repos\CGAL-test\x64\Debug\CGAL-test.exe : fatal error LNK1120: 4 个无法解析的外部命令
通常无法解析的外部符号是由于 lib 缺失引起的,错误原因可以看出是 gmplib 缺失,可以从官方网站下载。
无法解析的外部符号参考:
4.2 下载缺失的 gmplib
找到缺失的 LIB,GMP,下载下列两个预编译的库文件(官方下载链接):
解压到同一目录下:
gmplib 缺失参考:
-
https://doc.cgal.org/latest/Manual/thirdparty.html#secessential3rdpartysoftware
-
https://github.com/CGAL/cgal/issues/4154 - github issue
-
https://stackoverflow.com/questions/48354266/cgal-skeletonization-compile-errors
4.3 修改项目属性
下载完成后,需要将上述库添加到项目中。
项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项,添加上刚刚解压得到的两个 lib 文件;然后将两个 dll 放置在系统目录下或者编译出的 exe 同级目录下。再次尝试编译运行,应该可以成功。
如果有以下问题:
-
编译错误:“无法解析的外部符号”;说明项目中 lib 没有添加成功,检查下路径是否正确。
-
运行错误:“由于找不到xxx,无法继续执行代码”(下图);说明 dll 位置放错了,把它放到生成的 exe 的同级目录下就可以了。
如果在运行某软件或编译程序时提示缺少、找不到libgmp-10.dll等类似提示,libgmp-10.dll 拷贝到指定目录即可(一般是system系统目录或放到软件同级目录里面),或者重新添加文件引用。
References
- CGAL 5.0.2 - Manual Documentation https://doc.cgal.org/latest/Manual/index.html
- Vcpkg Github Page https://github.com/microsoft/vcpkg