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

2023-10-31

诸多经验贴都建议参考CGAL官方网站的步骤一步一步配置,因为我懒得看英文所以找的都是中文博客和问答,结果走了不少弯路,这里开一篇经验贴,记录错误也方便以后的查阅。本文是基于VS2017的配置和使用。这里是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<iostream>
#include<boost\thread.hpp>
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 演示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • c4d问题一:如何将坐标轴对齐到模型的地面中间处,也就是归零到世界坐标轴中心原点处,问题二:如何把模型刚好对齐到地面上

    问题一 如何将坐标轴对齐到模型的地面中间处 也就是归零到世界坐标轴中心原点处 一定要归零如上图所示的世界坐标轴才可以 不能调整右边那个坐标 问题二 如何把模型刚好对齐到地面上 使用地面对齐插件 即可一键对齐到地面了
  • 常用导航坐标系 及 转换关系 (理论+程序)

    一 坐标系定义与符号约定 在捷联惯导中 涉及到多种坐标系 其中 惯性坐标系 地心地固坐标系 导航坐标系 的示意图如下 下面给出常用的坐标系的定义 1 惯性坐标系 i 系 以地球质心为原点 轴指向地球自转轴 轴位 于赤道面指向空间任意点 轴与
  • 计算机图形学games101作业二 ---- 三角形光栅化 超采样抗锯齿 黑边处理

    games101作业二 三角形光栅化 超采样抗锯齿 黑边处理 本文是在学习计算机图形学时根据课程作业进行整理的笔记 有错误请指出 如果是同课程 请勿复制粘贴 谢谢 文章目录 CG homework1 0 本次作业 实现函数及简单描述 详细
  • networkx画图(番外)——(1)自定义节点布局

    networkx画图 番外 1 自定义节点布局 networkx虽然非常方便 但在一些超大规模的图数据上 依然显得吃力 所以大多数时候 它仅仅是被用来做一些实例性的分析和可视化展示的 这需要学会如何灵活的画图 最重要的就是布局 即每个节点在
  • Python123 练习5

    文章目录 1 一元二次方程求根 2 百钱买百鸡 3 鸡兔同笼 4 最大公约数和最小公倍数 5 判断三角形并计算面积 6 判断IP地址合法性 7 回文素数 8 反素数 9 今天是第几天 10 提取首字符 11 判断火车票座位 如果文章内容或代
  • Unity3D-----三维数学(向量)

    Unity3d gt 三维数学之向量 一 向量 1 什么是向量 2 向量的形式 3 向量的大小 4 向量的方向 二 向量运算 1 向量相减 2 向量相加 3 向量与标量的乘除法 4 点乘 5 叉乘 三 三角函数 1 角的度量单位 2 三角函
  • 基于BowyerWatson的Delaunay三角化算法实现

    实现效果如下图所示 代码 include
  • GAMES101课程学习笔记—Lec 10~12:Geometry 几何、隐式与显式、曲线与曲面、网格

    1 几何的表达方式 几何表达分为显式和隐式 1 1 隐式几何 举个例子 用空间中一个点来表示面 隐式的几何不会告诉我们这些点在哪里 而会告诉我们这些点满足的函数关系隐式的表达很难直接看出它的形状是什么 但是判断点的位置关系 在内在外在表面
  • 数值求解一维定态薛定谔方程

    背景 学习量子化学原理与应用课程时 一维定态薛定谔方程经常归结为解二阶偏微分方程 因此 学习数值解法一方面能够验证解析解 另一方面也能够应对更多更复杂的势垒函数对应方程的解 参考资料 https github com FelixDesroc
  • KaTeX

    KaTeX LaTeX数学公式编辑手册 只需要在第三列写法前后分别加上 就可以转换为符号 但需注意 CSDN的使用的是 KaTeX KaTeX KATE X数学公式 而不是 LaTeX LaTeX LATE X 两者会有些许区别 如果有
  • 情人节用Python画玫瑰花

    用Python turtle 绘制的玫瑰花 效果图 import turtle import time turtle penup turtle setup 1100 1000 turtle hideturtle turtle speed 1
  • OpenLayer和JSTS空间相交应用

    getAreaData DrawGeometry level const that this 多边形绘制结束后获取空间几何数据传递 获取边界 const drawExtent DrawGeometry getExtent 实例化jsts c
  • OpenGL assimp库,编译 ‘File too big‘,‘too many sections’,IFCReaderGen.cpp 中报错

    QT环境下配置Assimp库 MinGW编译器 48条消息 QT环境下配置Assimp库 MinGW编译器 Elsa的迷弟的博客 CSDN博客 IFCReaderGen cpp 中报错 too many sections问题 如下图所示 此
  • OpenGL学习笔记(十)-几何着色器-实例化

    参考网址 LearnOpenGL 中文版 4 7 几何着色器 4 7 1 基本概念 1 顶点和片段着色器之间有一个可选的几何着色器 几何着色器的输入是一个图元 如点或三角形 的一组顶点 顶点发送到下一着色器之前可对它们随意变换 将顶点变换为
  • 代数余子式的几何意义,点积和叉乘的几何意义

    1 点乘的几何意义 a b c d e f ad be cf 结果是一个标量 也可以写为 a b a b cos 以下说明点乘的几何意义 就是一个向量在另一个单位向量 如果另一个向量是单位向量 上的投影长度 a b b a cos a b
  • 关于深度图像

    深度图像 深度图像 depth image 也被称为距离影像 range image 是指将从图像采集器到场景中各点的距离 深度 作为像素值的图像 它直接反映了景物可见表面的几何形状 深度图像经过坐标转换可以计算为点云数据 有规则及必要信息
  • 【信号与系统】零输入响应和自由响应的区别

    课本内容 以下内容来自郑君里 信号与系统 第三版 上册 p61 1 自由响应和零输入响应都满足齐次方程的解 2 然而 它们的系数完全不同 零输入响应的系数仅由起始储能情况决定 而自由响应的系数要同时依从于起始状态和激励信号 3 自由响应由两
  • PCL 将对象模板与点云对齐

    目录 一 算法概述 二 代码实现 三 结果展示 四 相关链接 五 实验数据 一 算法概述 这是PCL官网给出的一个模版匹配教程 用来说明如何将其他教程中介绍的一些工具结合起来解决一个更高层次的问题 即将以前捕获的对象模型与一些新捕获的数据对
  • 空间直角坐标系右手系和左手系的判定方法及绕轴旋转的正方向

    1 判定坐标系 右手大拇指指向z轴方向 其余四指由x轴握向y轴方向 如果成功 那么判定为右手系 左手大拇指指向z轴方向 其余四指由x轴握向y轴方向 如果成功 那么判定为左手系 坐标系的种类判断成功 那么接下来该判断旋转正方向 2 旋转正方向
  • GAMES101:作业3

    GAMES101 作业3 附其他所有作业超链接如下 Games101 作业0 作业0 Games101 作业1 作业1 Games101 作业2 作业2 Games101 作业3 作业3 Games101 作业4 作业4 Games101

随机推荐

  • Spark RDD之Key-Value类型操作详解

    partitionBy案例 1 作用 对pairRDD进行分区操作 如果原有的partionRDD和现有的partionRDD是一致的话就不进行分区 否则会生成ShuffleRDD 即会产生shuffle过程 2 需求 创建一个4个分区的R
  • 了解链接是什么?

    链接是将各种代码和数据片段收集并且组合成为一个单一文件的过程 这个文件可以被加载到内存并且执行 链接可以执行于编译时 也就是在程序被加载器加载到内存并且执行 甚至在执行于运行的时候 也就是由应用程序来执行 在早期的计算机系统中 链接是手动执
  • OrCAD中DRC的使用简要说明

    OrCAD中DRC的使用简要说明 1 DRC的使用 Scope entire 检查所有设计 selection 检查选中部分 Mode 理解Mode需要先理解instance 实例 和occurrences 事件 这是OrCAD中非常重要的
  • 单元测试框架(JUnit和Unittest)

    单元测试就是针对最小功能单元编写测试代码 1 JUnit Unit 是一个 Java编程语言的单元测试框架 java程序最小的功能是方法 单元测试就是针对java方法的测试 测试单元中的每个方法必须可以独立测试 方法间不能有任何依赖 1 1
  • 浅谈多路复用select、epoll

    一 多路复用技术 在理解多路复用之前了解一下IO阻塞 IO非阻塞有利于理解IO多路复用 可以想象成父进程为董事长 其雇佣秘书 内核 帮助你监听读写缓冲区 常见的有select poll epoll 这里只谈一下select和epoll po
  • 【持续更新中】Unity常见问题及其解决

    目录 导出游戏时需要选择空的文件夹 CS0103错误 使用的变量名或者方法名并不存在于当前上下文中 CS1061错误 尝试调用方法或访问不存在的类成员 Unity怎么点都没反应 可能是进入了死循环 CS0428错误 类型转换错误 CS165
  • 编写自己的springboot starter

    一 编写自己的springboot starter 可能已经过时了 仅建议参考 引入对应的依赖 编写实现类 编写配置文件读取类 主要注解是 ConfigruationProperties 配置的值例如 example a 编写自动装配类 编
  • 《Deep Residual Learning for Image Recognition》论文学习

    Deep Residual Learning for Image Recognition 文章地址 Deep Residual Learning for Image Recognition arXiv 1512 03385 ResNet G
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 利用SpringBoot简单快速搭建WEB项目入门

    我们在WEB应用开发过程中 我们常常用到的语言是JAVA语言 作为WEB应用中的霸主级别中 的存在 却常常被嘲讽 人生苦短 我用python 是python程序员们引以为傲的格言 人们经常 将JAVA与时代新宠Python作比较 至今网上还
  • 用Python每天自动给女朋友免费发短信,谁说程序员不懂浪漫?

    前言 之前发过一篇文章 用 Python 制作的给父母天气预报提醒的小工具天气变冷了 给父母制作一个天气提醒小助手 这篇文章我同步到博客上之后 有读者在评论区留言 对于部分微信没有网页版接口 导致无法实现这个功能 这位读者建议 建议用发短信
  • Linux自动删除tomcat日志文件

    查看Linux启动的所有crontab crontab l 编辑crontab crontab e bin sh export LANG zh CN export WEB HOME webhome find dir path dir pru
  • 【渗透测试】Struts2系列漏洞

    目录 S2 001 1 漏洞原理 2 影响版本 3 验证方法 S2 005 1 漏洞原理 2 影响版本 3 验证方法 无回显 4 验证方法 有回显 S2 007 1 漏洞原理 2 影响版本 3 漏洞验证 S2 008 1 漏洞原理 2 影响
  • k8s 探针

    1 前言 Kubernetes探针 Probe 是用于检查容器运行状况的一种机制 探针可以检查容器是否正在运行 容器是否能够正常响应请求 以及容器内部的应用程序是否正常运行等 在Kubernetes中 探针可以用于确定容器的健康状态 如果容
  • CSDN账号等级提升规则

    2023最新 大家登录CSDN主要有两种需求 一是获取资源 另一种是发放资源 CSDN大约从2022年开始 不断调整等级规则 CSDN账号达到4级才能有资格上传付费资源 我搜索发现CSDN账号可能因实名的原因 没有买卖的 本文主要介绍3个内
  • 使用uni.share在IOS上分享不显示图片的问题

    问题背景 使用uni app跨平台 编译运行到ios上 发现分享图文的时候 图片无法显示 在安卓上分享正常 uni分享朋友圈api地址 uni share provider weixin scene WXSenceTimeline type
  • 寻找凸包

    问题 点集 Q 的凸包 convex hull 是一个最小的凸多边形 P Q 中的每个点或在 P 的边界上或 在 P 的内部 我们用 CH Q 表示点集 Q 的凸包 问题定义 输入 平面上的点集 Q 输出 Q 的凸包 CH Q a 请给出一
  • CreateEvent人工重置事件对象

    include
  • 基于springboot的在线考试系统

    本系统和现在有的考试系统有以下几种优势 a 和现在有的系统比较起来 本系统有科目 章节 老师 学生 班级等信息的管理 还有批阅试卷查看已批阅试卷等 传统的考试系统划分并不细 业务功能简单 b 和学校的考试系统还有外面的考试系统比较起来 本系
  • 【配置文档】配置使用CGAL库的经验分享

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