0. 前言
不久前,CGAL 5.0 正式被纳入稳定版,和先前的4.14版本相较不仅仅有算法上的“重大改变”和“突破性变化”,其安装、配置也稍有不同,对于不习惯使用CMake生成具体项目文件的人来说,VS属性页的配置也会有些区别。
1. 环境与下载
0) 环境:本人使用的是 Win 10 + VS 2017 + Qt 5.13
更新的VS和Qt版本应该都是可以的。
这里Qt注意两点:
- 最好在VS上安装 Qt VS tools
- 安装Qt时未安装 Qt Script的,使用 MaintenanceTool.exe 添加组件,储存库/资料库(如果需要)可填写https://mirrors.tuna.tsinghua.edu.cn/qt/online/qt5/windows/x86/online_repository/ ,部分Qt版本如5.11并不具有对应的Qt Script,根据Qt wiki应该添加前一版本对应的,但是这一方法并没有用,msvc2017_64libcmake 目录下没有出现相应的文件。这种情况下,请安装其它版本的Qt并在安装时勾选Qt Script。
1) 本体 CGAL 5.0,Windows下最方便还是用exe吧~
CGAL-5.0-Setup.exegithub.com2) CMake 推荐使用最新版本,当前为3.16.2,推荐msi:
Download | CMakecmake.org3) 主要依赖库——Boost 最新版本为1.72.0:
Boost 1.72.0www.boost.org4)其余可能用到的依赖库,以zlib、libQGLViewer、eigen为例:
a. zlib,最新版本 1.2.11,下载 tar.gz 这样的压缩包即可:
zlib Home Sitewww.zlib.netb. libQGLViewer,目前是2.7.2,似乎挺久没更新啦:(据我后面安装来看,并不需要 libQGLViewer,暂时放这备用)
libQGLViewer on Windowslibqglviewer.comc. Eigen 3.3.7,右侧 Get it 栏中下载压缩包即可:
Eigeneigen.tuxfamily.org2.安装
1)安装Boost
首先解压boost_1_72_0.7z/boost_1_72_0.zip,解压路径如 C:devboost_1_72_0
运行该目录下bootstrap.bat。稍等,会生成b2.exe和bjam.exe等文件,之后Win+R打开cmd,切换路径至该文件夹,如:
cd C:devboost_1_72_0
由于Boost实在是太大了,全部编译非常耗时和占用磁盘空间,而CGAL仅依赖于system和-thread,因此只编译这两个库:
b2.exe --with-system --with-thread
耐心等待,会得到像这样的结果:
The Boost C++ Libraries were successfully built!
The following directory should be added to compiler include paths:
C:devboost_1_72_0
The following directory should be added to linker library paths:
C:devboost_1_72_0stagelib
在 系统属性 - 高级 - 环境变量 的系统变量 或 用户变量 (看需求)中添加变量名 BOOST_INCLUDEDIR 和 BOOST_LIBRARYDIR ,对应变量值分别为上述结果中的两个路径,如:
2)其它依赖库
CMake
CMake的安装就不赘述,安装时可以选择添加到PATH。这里简述CMake的使用方法:
在 where is the source code 处填入源代码所在的文件夹,该路径下应有 CMakeLists.txt;
在 where to build the binaries 处填入建构项目的目标文件夹,这个文件夹一般应该是空的;
中间部分为建构项目所需的一些配置,建议勾选“grouped”,显示更一目了然。
zlib
Windows下zlib的安装是有些令人困惑的,一些教程也是语焉不详,这里给出的方法如果有问题请提醒我更正。
首先解压,打开 CMake - gui ,where is the source code 填入解压后的文件夹,where to build the binaries 填入一个新建的文件夹,如 C:devzlib_build,一般configure然后generate就行了。configure后可以看一眼,确认下INSTALL下各个路径是不是在C:Program Files (x86)zlib 下。
用VS打开 C:devzlib_buildzlib.sln (当然也可能在你选择的其它文件夹里),分别在debug和release模式下,依次右键ALL_BUILD和INSTALL - 生成(应该来说右键INSTALL然后生成就可以了,不确定),这时C:Program Files (x86)zlib 下就生成了我们需要的include和lib文件:
libQGLViewer
(据我后面安装来看,并不需要 libQGLViewer,暂时放这备用)
可以依照官网给出的步骤,解压后,用 Qt Creator 打开 libQGLViewer-2.7.2.pro ,Configure Project时勾选MSVC,右键构建即可。
在debug模式下可能出现报错:无法打开文件“QGLViewerd2.lib”,暂时不知道如何解决,但 QGLViewerQGLViewerd2.lib 文件实际上可以正常生成(因为QGLViewer子项目可以生成成功),而在release模式下可以正常生成所有项目。
QGLViewerQGLViewerd2.lib 和 QGLViewerQGLViewer2.lib 即是我们所需的。
eigen
解压即可,如解压至 C:deveigen-3.3.7 。
3)CGAL安装
终于到CGAL本体啦!运行CGAL-5.0-Setup.exe,最好将它安装到一个较简短的路径下,如C:devCGAL-5.0 。 打开CMake,如前述的zlib,第一个where填刚才的路径,第二个where填一个新建的文件夹路径,如C:devCGAL-5.0 build ;
逐条介绍下 CMake 3.13.2+CGAL 5.0 的配置
- Ungrouped Entries 里基本都是Qt的路径,如果没有正常识别,需在环境变量中添加Qt5_DIR ,并重新configure一下;
- BUILD 和 CGAL 基本不用管;
- Boost 要注意下,这里正确识别出了 Boost的包含目录,下方也给出了正确的Boost版本号:USING BOOST_VERSION = '1.72.0',但Boost_DIR显示为not found,这是CMake的问题,无需过于介意;
- GMP 和 MPFR 里路径应该都是 CGAL-5.0/auxiliary/gmp 下的;
- WITH 这组要特别注意,根据需求勾选,建议勾上 WITH demos 和 WITH examples ,有例子更容易验证安装是否成功;
- ZLIB 这一组可能需要手动填写:在默认情况下,应该这样填写:
重新 configure ,配置列表将被更新,需要填写其中你需要的组件相关的,例如 Ungrouped Entries 里会增加EIGEN3_INCLUDE_DIR,需填写解压所在的文件夹。如果安装了VTK、OpenCV等,也可以填写相应路径。因为 demos 和 examples 里包含许多依赖库,如METIS,OpenMesh、Cimg。看个人需求,不要就不用管那些个NOT FOUND,期间需要configure多次,直到确认红字中提示缺少的确实是你没有安装的,然后Generate就好。
4)编译
Generating done后,用VS打开CGAL-5.0 buildCGAL.sln,release模式下右键ALL_BUILD,生成。
3.Demo
以 Surface mesh 为例,打开 CGAL-5.0 buildexamplesSurface_meshSurface_mesh_Examples.sln,将draw_surface_mesh设为启动项目,release模式编译运行,会发现缺少dll:
最笨的方法当然是逐个将 QtQt5.13.05.13.0msvc2017_64lib 中各dll复制到 CGAL-5.0 buildexamplesSurface_meshRelease 路径下,也可将这些文件的完整路径名加入到链接 - 输入 - 附加依赖项 中。
究其根本,这是代码生成模式的问题,理论上将 代码生成 - 运行库 从 MD 改为 MT 就可以了,但是直接改会报错,目前尚不清楚原因,麻烦些用动态链接就可以了。
这时还有一个问题是这里并没有源码中所写的 data/elephant.off ,将 CGAL-5.0examplesSurface_meshdata 中的该文件复制到 CGAL-5.0 buildexamplesSurface_meshdata 下,运行:
唔,还行吧……
4.VS属性页
忘了属性页了,如果不愿意用CMake生成的话,如何填写VS属性页呢?
我们可以参考CMake生成文件是如何填写的,在排除Qt的情况下,VS属性页的填写实际上相较4.14更简单了:
链接 - 输入 - 附加依赖项:
- C:devCGAL-5.0auxiliarygmpliblibmpfr-4.lib
- C:devCGAL-5.0auxiliarygmpliblibgmp-10.lib
C/C++ - 常规 -附加包含目录:
- C:devCGAL-5.0 buildinclude
- C:devCGAL-5.0include
- C:devCGAL-5.0auxiliarygmpinclude
- C:devboost_1_72_0
当然比较传统的写法是 VC++目录 - 包含目录中填写以上的四项,都是可以的。