Loading

Windows 下安装 CGAL 并验证安装

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... // 然后就一直不动了

1588501410461

每次下载不动的时候,可以手动下载,然后放到它需要的目录下(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

1588502492112

手动是可以打开下载该文件的,只是下载后不知道放在哪里,所以这个问题和问题1不太一样。

相关的 github issue:https://github.com/microsoft/vcpkg/issues/11005

解决方法:过一会儿再下载,可能是网络状况问题。我在换用校园网后下载成功了。这类问题在安装过程中一直出现,多执行几次命令,或者换一个网络环境再试一试。

总结:大部分是网络问题,能手动下载的可以手动下载,否则可以换个网络环境,多执行几次脚本。

最后安装成功的截图:(总共花费了差不多 30 min)

1588510949256

3. 编译例子验证 CGAL 安装

3.1 添加 CGAL 到项目包含目录

在 VS 中新建 Visual C++ 空项目,在解决方案资源管理器中,右键项目属性,打开属性页:

  1. 配置属性 -> VC++ 目录 -> 包含目录 -> 编辑,
  2. 添加上刚刚安装的 CGAL 目录:YOUR_INSTALL_DIR\vcpkg\installed\x86-windows\include,如下图

1588505907647

要注意,属性页的配置和平台选项(属性页最上方)需要和工具栏中的一致,图中均为:Debug - x64

3.2 编写程序并运行

这里的代码使用参考官方文档中的 Hellow Worldhttps://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 查看运行结果

编译运行,可以得到如下输出:

image-20200504131209715

这时 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

image-20200512173829933

使用 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

image-20200512172958495

找到缺失的 LIB,GMP,下载下列两个预编译的库文件(官方下载链接):

解压到同一目录下:

image-20200512181151902

gmplib 缺失参考:

4.3 修改项目属性

下载完成后,需要将上述库添加到项目中。

项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项,添加上刚刚解压得到的两个 lib 文件;然后将两个 dll 放置在系统目录下或者编译出的 exe 同级目录下。再次尝试编译运行,应该可以成功。

如果有以下问题:

  1. 编译错误:“无法解析的外部符号”;说明项目中 lib 没有添加成功,检查下路径是否正确。

  2. 运行错误:“由于找不到xxx,无法继续执行代码”(下图);说明 dll 位置放错了,把它放到生成的 exe 的同级目录下就可以了。

image-20200512192713705

如果在运行某软件或编译程序时提示缺少、找不到libgmp-10.dll等类似提示,libgmp-10.dll 拷贝到指定目录即可(一般是system系统目录或放到软件同级目录里面),或者重新添加文件引用。

References

posted @ 2020-05-03 22:05  CrayonSea  阅读(1715)  评论(0编辑  收藏  举报