【配置文档】配置使用CGAL库的经验分享

诸多经验贴都建议参考CGAL官方网站的步骤一步一步配置,因为我懒得看英文所以找的都是中文博客和问答,结果走了不少弯路,这里开一篇经验贴,记录错误也方便以后的查阅。本文是基于VS2017的配置和使用。这里是CGAL的使用手册

文章目录

      • 一、需要的工具
      • 二、boost的编译
        • 编译boost
        • 编译技巧
        • boost命名规则
      • 三、Qt5的安装
      • 四、CMake
      • 五、CGAL的编译
      • 六、例子程序
      • 七、参考资料

一、需要的工具

  1. boost,因为CGAL需要使用到boost,所以得提前编译好,或者下载别人已经编译好的,这样比较节省时间,但是我在自己配置boost的时候只编译了thread,时间也比较快,不过之后还可能要求其他的组件,会在后面提到
  2. Qt5,主要是在运行CGAL例子程序的时候需要,反正我还是选择安装了,如果不能在线安装的话离线包点击这里下载
  3. CMake

二、boost的编译

下载地址
我这下载的是boost_1_68_0.7z,直接解压即可

编译boost

(1)建议用管理员权限打开cmd;或开始目录vs2017里的“适用于 VS 2017 的 x86_x64 兼容工具命令提示”
(2)用命令进入boost根目录,或者根目录下面的booststrap.bat文件直接拖到cmd打开的界面并回车,运行结束后会产生b2.exe和bjam.exe,这里b2.exe是bjam.exe的新版本;(有的下载的是一个打包好的boost.exe,那么运行这个exe,在其安装目录下可以找到booststrap.bat文件;有的下载下来不是exe,那么解压下载的boost应该就能直接看到booststrap.bat文件
(3)运行b2.exe;
(4)编译完成。

但是按照以上步骤编译完的库太大,许多功能用不上,而且编译时间较长,我们这里建议下载已经编译好的库,或者只编译我们所需要的内容

编译技巧

b2 stage --toolset=msvc-14.1 --with-thread --stagedir="D:\mySDK\boost_1_68_0\lib" link=shared runtime-link=shared  threading=multi debug release
b2 stage --toolset=msvc-14.1 --with-thread --stagedir="D:\mySDK\boost_1_68_0\lib" link=static runtime-link=static  threading=multi debug release
  • 这里命令是b2或者bjam都行,
  • stage和install命令都可以用于安装,stage的话指定目录用stagedir,install的话指定目录用prefix
  • –toolset=XXXX指定目标编译器需要自己去查,我们这里是msvc-14.1即VS2017
  • –with-XXX用于创建和安装指定的库,–without-XXX不对指定的库进行创建和安装,默认创建所有的库,注意with后面是“-”而不是“=”否则会全部编译
  • link=static|shared指定创建静态库或动态库
  • runtime-link=static|shared指定创建的库是静态链接还是动态链接到C运行库(或C++标准库),这个选项需依据–link的类型,不同的编译器允许的链接策略不一样,比如在GCC下,在生成动态库(–link=shared)时,就不允许进行静态链接到C运行库(或C++标准库)。
  • threading=single|multi指定创建多线程或单线程的版本库。
  • debug release版都要

不管静态库还是动态库这里我都编译了,谨防之后的的错误,结果防不胜防…
重点关注【runtime-link=X】 X的取值是share和static,前者指定生成动态lib,后者则是生成静态lib。
X = static 时 vs项目属性 → C/C++ →代码生成 → 运行库 【多线程调试(/MTd)】
X = share 时 vs项目属性 → C/C++ →代码生成 → 运行库 【多线程调试 DLL (/MDd)】

然后include根目录,link你的目标lib目录,千万确保正确,运行例子程序

#include
#include
void trd_fun()
{
	std::cout << "test" << std::endl;
}

int main()
{
	boost::thread td(trd_fun);
	td.join();
	system("pause");
	return 0;
}

之后发现依旧报错,说缺少datetime的lib,所以再次编译一遍

b2 stage --toolset=msvc-14.1 --with-date_time --stagedir="D:\mySDK\boost_1_68_0\lib" link=shared runtime-link=shared  threading=multi debug release
b2 stage --toolset=msvc-14.1 --with-date_time --stagedir="D:\mySDK\boost_1_68_0\lib" link=static runtime-link=static  threading=multi debug release

成功解决问题

boost命名规则

Win32平台
libboost_filesystem-vc80-mt-sgdp-1_40.lib
Linux平台
libboost_filesystem.so.1.40.0
libboost_filesystem.a
命名规则:
前缀:lib,但在Win32平台,只有静态库有lib前缀
库名称:以boost_开头的库名称,例子中为boost_filesystem
编译器标识:编译该库文件的编译器名称和版本,例子为-vc80
多线程标识:若支持多线程,则使用-mt;否则,不出现多线程标识
ABI标识:标识Boost库的几个编译链接选项
s:static,静态库标识
gd:debug版标识
p:使用STLpor而不是编译器自带的STL
版本号:Boost的版本号,例子为1_40
扩展名:win32平台为.lib,Linux平台为.a或.so

三、Qt5的安装

下载地址
我这下载的是qt-opensource-windows-x86-5.12.0.exe
对于咱们的需求安装这篇博客不错,基本上没遇到什么问题

四、CMake

下载地址
我这下载的是cmake-3.15.0-rc2-win64-x64.msi
说到CMake真是一把辛酸泪了,编译通不过有一部分就是他的原因,首先尽量选择最新的版本,否则它找不到boost。不要管它的提示什么BOOST_INCLUDE_DIR 没有设好,你确定自己的环境变量没有错而又使用的是最新的boost,那么很有可能是CMake没有及时更新,没有识别出你的版本。也就是在编译CGAL的时候FindBoost.cmake里没有最新boost版本,CMake编译不了
有方法说在老版本FindBoost.cmake文件里增加"1.68.0" ,反正我是没有成功

#这是新版的列表
  # The user has not requested an exact version.  Among known
  # versions, find those that are acceptable to the user request.
  #
  # Note: When adding a new Boost release, also update the dependency
  # information in _Boost_COMPONENT_DEPENDENCIES and
  # _Boost_COMPONENT_HEADERS.  See the instructions at the top of
  # _Boost_COMPONENT_DEPENDENCIES.
  set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS}
    "1.70.0" "1.70" "1.69.0" "1.69"
    "1.68.0" "1.68" "1.67.0" "1.67" "1.66.0" "1.66" "1.65.1" "1.65.0" "1.65"
    "1.64.0" "1.64" "1.63.0" "1.63" "1.62.0" "1.62" "1.61.0" "1.61" "1.60.0" "1.60"
    "1.59.0" "1.59" "1.58.0" "1.58" "1.57.0" "1.57" "1.56.0" "1.56" "1.55.0" "1.55"
    "1.54.0" "1.54" "1.53.0" "1.53" "1.52.0" "1.52" "1.51.0" "1.51"
    "1.50.0" "1.50" "1.49.0" "1.49" "1.48.0" "1.48" "1.47.0" "1.47" "1.46.1"
    "1.46.0" "1.46" "1.45.0" "1.45" "1.44.0" "1.44" "1.43.0" "1.43" "1.42.0" "1.42"
    "1.41.0" "1.41" "1.40.0" "1.40" "1.39.0" "1.39" "1.38.0" "1.38" "1.37.0" "1.37"
    "1.36.1" "1.36.0" "1.36" "1.35.1" "1.35.0" "1.35" "1.34.1" "1.34.0"
    "1.34" "1.33.1" "1.33.0" "1.33")

五、CGAL的编译

下载地址
我这下载的是CGAL-4.13.1-Setup.exe
(1)下载完以后完成安装,注意环境变量里有没有CGAL_DIR,值为CGAL根目录
(2)之后,在CMake里找到CGAL的根目录,然后设置目标build的目录,这个不多说
(3)记得在用户变量下给boost增加环境变量
BOOST_INCLUDEDIR:boost根目录
BOOST_LIBRARYDIR:自己编译生成的boost的lib目录,不是原本的libs目录!
Path:里面添加BOOST_LIBRARYDIR的路径,Qt的路径
(4)在cmake-gui界面点击左下角:Configure
(5)在第四步无错误的情况下,将下图的两个选项WITH_demos和WITH_examples勾选上,这样可以得到CGAL的例子程序(也可以不选上,在第七部分有讲解)然后点击Generate,完成后在你选择的输出路径下有一个CGAL.sln;
Generate
(6)建议在CGAL.sln选择好某一个工程为启动项目,否则生成几百个浪费时间。
运行之前,在环境变量里添加Path:…\CGAL-4.7\auxiliary\gmp\lib

当然以上这是运行编译生成的例子,如果我们需要自己建一个使用CGAL的工程,建立工程之后是需要配置的:
在使用CGAL的时候,需要设置 属性->配置属性->VC++目录:

可执行目录:

  • $(QTDIR)\5.5\msvc2013\bin
  • $(CGAL_DIR)\auxiliary\gmp\lib
  • $(CGAL_DIR)\bin(or \build\bin)

include目录中包含:

  • $(BOOST_INCLUDEDIR)
  • $(CGAL_DIR)\include
  • $(CGAL_DIR)\auxiliary\gmp\include

lib目录中包含:

  • $(QTDIR)\5.5\msvc2013\lib
  • $(BOOST_LIBRARYDIR)
  • $(CGAL_DIR)\lib
  • $(CGAL_DIR)\auxiliary\gmp\lib

属性->配置属性->链接器->输入中附加依赖项:

  • libgmp-10.lib
  • libmpfr-4.lib

忽略项:

  • gmp-vc100-mt-gd.lib
  • mpfr-vc100-mt-gd.lib

即便如此,最后还是会出现“找不到 CGAL-vc140-mt-gd-4.13.1.dll”,“找不到 CGAL_Core-vc140-mt-gd-4.13.1”,没关系,从$(CGAL_DIR)\build\bin中找出来,扔到你的项目目录下即可。

(7)看到这里说明第五步并没有成功,我就在Generate阶段遇到了诸多问题,这里告诉大家一一解决:

  1. 报错说missing components:
    serialization iostreams regex 和 bzip2 zlib
    遂继续安装这几个组件
b2 stage --toolset=msvc-14.1 --with-thread --with-serialization --with-iostreams --with-regex  --stagedir="D:\mySDK\boost_1_68_0\lib" link=shared  runtime-link=shared threading=multi debug release
b2 stage --toolset=msvc-14.1 --with-thread --with-serialization --with-iostreams --with-regex  --stagedir="D:\mySDK\boost_1_68_0\lib" link=static  runtime-link=static threading=multi debug release
  1. 但是还是报错说缺少 bzip2 zlib,因为这两个
    我们先下载bzip2,当然官网建议去sourceforge下载;
    然后下载zlib,下载完解压放好位置就行
    然后再次编译,方法在这里,将这两个库添加到iostreams里
b2 stage --with-iostreams -s BZIP2_SOURCE="D:\mySDK\bzip2-1.0.6" -s ZLIB_SOURCE="D:\mySDK\zlib-1.2.11" --stagedir="D:\mySDK\boost_1_68_0\lib"
  1. 报错又说Could NOT find Eigen3
    我们先下载Eigen3然后添加到cmake的Advanced的目录里EIGEN3_INCLUDE_DIR添加Eigen3的目录就好了Eigen3
    最后sln终于生成成功!

六、例子程序

官网的教程很详细了,我们发现,在第五部分的第5步其实并不一定要勾选WITH_demos和WITH_examples生成sln,因为我们可以选择…\CGAL-4.13.1\demo或者…\CGAL-4.13.1\examples的某一个项目然后用cmake去编译生成,中间有一个小插曲,如果用cmake configure和generate生成出的某一个项目只有ALL_BUILD和ZERO_CHECK却没有你想要的工程,原因是用普通权限或者用户权限generate时cmake没有识别出环境变量CGAL_DIR的目录,记得在窗口的value值加上,这样就好了~

七、参考资料

Qt5的安装
CGAL编译与配置
CGAL配置的一点心得(各种错误的解决办法)
CGAL配置后使用时遇到的一些问题及解决方法
CGAL在VS2013中的安装关键问题的解决
CGAL DEMO 演示

你可能感兴趣的:(手册)