CentOS下CGAL开发环境配置

2023-11-01

1. 必要的说明

1.1 简介

CGAL 的全称是 Computational Geometry Algorithms Library,计算几何算法库。它是使用 C++ 语言编写的开源软件,它被广泛应用于几何计算相关的领域,提供众多计算几何相关的数据结构与算法诸如三角剖分,Voronoi 图,多边形,多面体,曲线整理及其应用,网格生成,几何处理,凸壳算法,搜索结构,插值,形状分析,拟合,距离等。当前版本 5.1。阅读本文前也可大致浏览下

使用CGAL需提前安装如下核心组件:

  1. C++ 编译器
  2. CMake
  3. Boost
  4. GMP 和 MPFR
  5. Qt5(开发时用)

1.2 软件安装说明

根据基础情况不同,软件安装顺序如下:

  1. 当你已有 g++ 6.3.0 及以上版本时,安装从左至右依次进行。

    1 2 3 4 5 6
    GMP MPFR Boost CMake Qt5 CGAL
  2. 当现有版本低于 g++ 6.3.0 且想源码编译安装高版本 g++ 时,还需软件 MPC ,从左至右依次安装。

    1 2 3 4 5 6 7 8
    GMP MPFR MPC GCC Boost CMake Qt5 CGAL

本文是在第 2 种情况下进行安装的。为啥要强调顺序呢?因为他们有较强的依赖关系:

  • GCC 编译依赖于GMP,MPFR 和 MPC
  • MPFR 依赖于GMP
  • MPC 依赖于 GMP 和 MPFR
  • CGAL 的很多 Examples 又需要Qt5的支持

2. 依赖软件安装

2.1 GMP & MPFR & MPC & GCC

这部分内容篇幅较长拆出,见如下

2.2 Boost

2.3 CMake

2.4 Qt

还没安装图形化界面的童鞋请看这里,如果使用的是 Tencent Cloud 或 Aliyun 远程服务器的话,使用VNC连接远程主机更方便。

本文直接使用图形化界面安装 Qt,执行如下命令后可视化安装。

[root@VM-0-9-centos home]# mkdir qt
[root@VM-0-9-centos home]# cd qt
[root@VM-0-9-centos qt]# wget http://download.qt.io/official_releases/qt/5.14/5.14.0/qt-opensource-linux-x64-5.14.0.run
[root@VM-0-9-centos qt]# chmod +x qt-opensource-linux-x64-5.14.0.run
[root@VM-0-9-centos qt]# ./qt-opensource-linux-x64-5.14.0.run

完成后就可以开始正式安装 CGAL 吧。

3. CGAL

按常理先建目录,再下载解压,如下

[root@VM-0-9-centos home]# mkdir /home/cgal
[root@VM-0-9-centos home]# cd cgal
[root@VM-0-9-centos cgal]# wget https://github.com/CGAL/cgal/releases/download/v5.1/CGAL-5.1.tar.xz
[root@VM-0-9-centos cgal]# tar -xvf CGAL-5.1.tar.xz
[root@VM-0-9-centos cgal]#  cd CGAL-5.1

由于 CGAL 5.0 是默认的仅header格式,做戏做全套,我们不用这种默认方式。创建 build/ 目录后在该目录下cmake ,注意有两个 . 点儿。

[root@VM-0-9-centos CGAL-5.1]#  mkdir build
[root@VM-0-9-centos CGAL-5.1]#  cd build
[root@VM-0-9-centos build]#  cmake -DCGAL_HEADER_ONLY=OFF -DCMAKE_BUILD_TYPE=Release ..

重点来了啊,上面这一步的输出一定要好好看,有任何一个错误都是以后的麻烦。正确输出应有如下

[root@VM-0-9-centos build]# cmake -DCGAL_HEADER_ONLY=OFF -DCMAKE_BUILD_TYPE=Release ..
...
== Generate version files ==
...
##########   1. 看 c++ 版本是不是安装的最新的, 版本低会导致失败   ##########
-- Using /usr/local/bin/c++ compiler.
-- USING CMake version: 3.19.0
-- System: Linux
-- USING GCC_VERSION = '10.2.0'
== Generate version files (DONE) ==
...
##########   2. 开始核验依赖库情况   ##########
-- External libraries supported: GMP;MPFR;ZLIB;OpenGL;LEDA;MPFI;RS;RS3;OpenNL;Eigen3;ESBTL;Coin3D;NTL;IPE
##########   3. 看 gmp 的 头/库 文件的路径及版本号是否填充且是正确的    ##########
-- Preconfiguring library: GMP ...
-- GMP has been preconfigured:
--   UseGMP-file:
--   GMP include:      /usr/local/include
--   GMP libraries:    /usr/local/lib/libgmp.so
--   GMP definitions:
-- USING GMP_VERSION = '6.2.0'
##########   4. 看 mpfr 的 头/库 文件的路径及版本号是否填充且是正确的    ##########
-- Preconfiguring library: MPFR ...
-- MPFR has been preconfigured:
--   UseMPFR-file:
--   MPFR include:      /usr/local/include
--   MPFR libraries:    /usr/local/lib/libmpfr.so
--   MPFR definitions:
-- USING MPFR_VERSION = '4.1.0'
##########   5. 看boost,这个有头就行    ##########
-- Boost include dirs: /usr/local/include
-- Boost libraries:
== Detect external libraries (DONE) ==

== Write compiler_config.h ==
...
== Write compiler_config.h (DONE) ==

== Generating build files ==
##########   6. 看 gmp,mpfr,boost 应找到对应的版本了    ##########
Configuring libCGAL
-- Using gcc version 4 or later. Adding -frounding-math
-- USING GMP_VERSION = '6.2.0'
-- USING MPFR_VERSION = '4.1.0'
-- USING BOOST_VERSION = '1.74.0'
libCGAL is configured
-- Sources for CGAL component library 'CGAL_Core' detected
Configuring libCGAL_Core
##########   7. CGAL_Core 配置完成    ##########
libCGAL_Core is configured
-- Sources for CGAL component library 'CGAL_ImageIO' detected
Configuring libCGAL_ImageIO
-- USING ZLIB_VERSION = '1.2.7'
##########   8. CGAL_ImageIO 配置完成    ##########
libCGAL_ImageIO is configured
-- Sources for CGAL component library 'CGAL_Qt5' detected
Configuring libCGAL_Qt5
-- USING Qt5_VERSION = '5.14.0'
##########   9. CGAL_Qt5 配置完成,非常重要,容易失败(大概率由于没添加环境变量)   ##########
libCGAL_Qt5 is configured
-- Sources for CGAL component libraries 'CGAL_Core;CGAL_ImageIO;CGAL_Qt5' detected
== Generating build files (DONE) ==

-- Configuring done
-- Generating done
-- Build files have been written to: /home/cgal/CGAL-5.1/build

然后执行

[root@VM-0-9-centosbuild]#  make
[root@VM-0-9-centos build]#  make install

4. 测试

4.1 构建一个Example

[root@VM-0-9-centos build]#  cd ../Triangulation_3/
[root@VM-0-9-centos Triangulation_2]# cmake -DCMAKE_BUILD_TYPE=Release .
-- Found Boost: /usr/local/lib/cmake/Boost-1.74.0/BoostConfig.cmake (found version "1.74.0")  
-- Found Boost: /usr/local/lib/cmake/Boost-1.74.0/BoostConfig.cmake (found suitable version "1.74.0", minimum required is "1.48")  
-- Boost include dirs: /usr/local/include
-- Boost libraries:    
-- Configuring done
-- Generating done
-- Build files have been written to: /home/cgal/CGAL-5.1/examples/Triangulation_2
[root@VM-0-9-centos Triangulation_2]# make

在图形界面下执行,弹出图形窗口,运行成功

[root@VM-0-9-centos Triangulation_2]# ./draw_triangulation_2 

4.2 使用Qt编译一个CGAL项目

创建 名为 cgaltest2 的 Qt 控制台项目,其中 main.cpp 如下

#include <QCoreApplication>
#define CGAL_USE_BASIC_VIEWER
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_3.h>
#include <CGAL/point_generators_3.h>
#include <CGAL/draw_triangulation_3.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Delaunay_triangulation_3<K>                   DT3;
typedef CGAL::Creator_uniform_3<double,K::Point_3>          Creator;

int main()
{
  std::vector<K::Point_3> points;
  CGAL::Random_points_in_sphere_3<K::Point_3,Creator> g(1.0);
  std::copy_n(g, 50, std::back_inserter(points));
  DT3 dt3(points.begin(), points.end());
  CGAL::draw(dt3);
  return EXIT_SUCCESS;
}

cgaltest2.pro 如下

QT -= gui
QT += widgets
QT += xml
QT += opengl

CONFIG += c++14 console
CONFIG -= app_bundle

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
        main.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
LIBS += -L/usr/local/lib64/ -lgmp
LIBS += -L/usr/local/lib64/ -lCGAL_Qt5

编译运行。

5. 可能出现问题

5.1 CGAL_USE_BASIC_VIEWER is not defined.

Qt图形程序编译完成,执行后出现如下错误

Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined.

解决办法
需对其进行定义,在 main.cpp 前添加

#define CGAL_USE_BASIC_VIEWER

5.2 undefined reference to `__gmpz_mul’

编译 Qt 项目时出现错误如下

/usr/local/include/gmpxx.h:496: error: undefined reference to `__gmpz_mul'

解决办法
需对其进行定义,在 .pro 前添加(找到自己机器下该文件路径)

LIBS += -L/usr/local/lib64/ -lgmp

这种问题出现的较多,还有类似于

/usr/local/include/CGAL/Qt/frame.h:133: error: undefined reference to `vtable for CGAL::qglviewer::Frame'```

需添加

LIBS += -L/usr/local/lib64/ -lCGAL_Qt5

5.3 Killed signal terminated program cc1plus

编译 Qt 项目时出现错误如下

:-1: error: fatal error: Killed signal terminated program cc1plus

解决办法
常出现在云服务器中,是由于内存不足造成的。可通过设置2G交换分区来解决该问题。

#获取要增加的2G的SWAP文件块
dd if=/dev/zero of=/swapfile bs=1k count=2048000
#创建SWAP文件
mkswap /swapfile 
#激活SWAP文件
swapon /swapfile   
#查看SWAP信息是否正确
swapon -s  
#添加到fstab文件中让系统引导时自动启动
echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab

6. 参考

[1] https://doc.cgal.org/latest/Manual/usage.html
[2] https://www.lxx1.com/3886

.
.
.
.
.
.


桃花仙人种桃树,又摘桃花换酒钱_

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

CentOS下CGAL开发环境配置 的相关文章

  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • QTimer 一点也不准确?

    运行在 Windows7 64 位机器上 具有非常强大的 CPU 8 核 16 线程 我使用 QTimer 以 50Hz 触发函数调用 但我最终得到了 30Hz 函数调用本身肯定需要不到 10 毫秒才能完成 整个过程发生在一个单独的线程中
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • Qt 5.3 无法使 QCompass (QSensor) 在 Windows 8.1 上工作

    我无法让传感器在我的 Asus Transformer T100 上工作 磁力计和指南针无法启动 并且我从加速度计获得假值 始终 x 0 y 9 8 z 0 即使使用我的笔记本电脑 我总是得到相同的结果 第一段文字编辑 Initialisa
  • 为什么 QGraphicsWidget 的选择边框在 QGraphicsScene 中不可见?

    我已经通过一个小部件添加到图形场景 QGraphicSscene QGraphicsProxyWidget 问题是 当我选择该项目时 它被选中 但选择边框不可见 这是代码 QDial dial new QDial Widget dial g
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • QWidget::showMinimized() 不起作用

    在 Ubuntu 13 04 上 如果使用QWidget showMinimized 为了最小化窗口 我发现通过单击系统任务栏上的应用程序图标恢复它后 调用QWidget showMinimized 无法工作 connect minimum

随机推荐

  • C++ stack用法

    C 库以提供 模板 为主 所谓模板 是指不必预先制定类型的函数或类 我们可以借助STL 标准模板库 Standard Template Library STL 提供的高效算法来管理数据 为应对多种需求 STL为用户提供了多种名为容器 Con
  • chatgpt赋能python:Title:Python编程中的空格怎么用?详细教程!

    Title Python编程中的空格怎么用 详细教程 Introduction Python编程的空格使用一直是令人困惑的话题之一 但它却是Python语言中非常重要的一部分 空格在Python程序中用来表示代码块的开始和结束 因此不同的空
  • python中的堆(Heap)

    python中的堆 Heap 堆 Heap 是一种特殊的完全二叉树数据结构 有两种类型 大顶堆和小顶堆 在大顶堆中 父节点的值大于或等于其子节点的值 而在小顶堆中 父节点的值小于或等于其子节点的值 特点 堆是一种完全二叉树 意味着当除最后一
  • 软件测试之白盒测试、自动化测试练习题报告

    一 白盒测试 1 代码走查 2 代码编写及测试 二 自动化测试 总结 今天下午熟背白盒测试的代码 第一题进行详细分析 背完之后 写第一题代码 运行测试 写入报告中 花时间15分钟以内 在编译的时候 出现错误 都是小细节的错误 手抖多敲一个字
  • 谁还在AI焦虑?

    时至今日 人们对GPT 为首的诸多AI 大有热情消退的迹象 与2个月前相比 简直恍如隔世 这也进步一部印证了 山洞隐喻 人类始终对未知充满恐惧和焦虑 曾经人们忧心忡忡 整天讨论AI 取代人类工作之后 大家应该何去何从 AI入侵人类社会 大家
  • PooledConnection has already been closed.

    PooledConnection has already been closed java sql SQLException PooledConnection has already been closed 数据库链接被关闭 排查被关闭的原
  • 何恺明团队最新力作RegNet:超越EfficientNet,GPU上提速5倍,这是网络设计新范式

    鱼羊 十三 发自 凹非寺量子位 报道 公众号 QbitAI 大神 组团 出奇招 踢馆各路神经网络 还是熟悉的团队 还是熟悉的署名 Facebook AI实验室 推陈出新挑战新的网络设计范式 嗯 熟悉的Ross 熟悉的何恺明 他们带来全新的
  • 九十四.深入递归(一)

    题一 走楼梯 有个小孩正上楼梯 楼梯有n阶台阶 小孩一次可以上1阶 2阶 3阶 请实现一个方法 计算小孩有多少种上楼的方式 为了防止溢出 请将结果Mod 1000000007 给定一个正整数int n 请返回一个数 代表上楼的方式数 保证n
  • 查询与进程调度(CFS)相关信息

    目录 查询与进程相关的调度信息 查看CFS调度信息 CPU相关的信息 CFS就绪队列的总运行时间 实时队列与deadline调度的相关信息 所有进程相关的信息 查询与进程相关的调度信息 进程的nice值 优先级 调度策略 vruntime等
  • fastdfs安装部署整理

    一 fastdfs环境搭建 下面准备 2 个环境模拟部署并测试 准备工作 主服务器 192 168 100 10 从服务器 192 168 100 11 步骤1 了解 fastDFS 原理 这次是最简单的 storage 同步 不涉及多 t
  • SQL Part 1 --- 简单的SQL查询

    SQL 简单的SQL查询 SQL中的数据类型 SQL中的表 Tables 简单的SQL查询 简单SQL查询的执行步骤 在查询中链接多个表 复杂SQL查询的执行步骤 Banking Example SQL中的数据类型 Characters C
  • spring security oauth2——AbstractAuthenticationProcessingFilter

    AbstractAuthenticationProcessingFilter的作用 abstractAuthenticationProcessingFilter的职责也就非常明确 处理所有HTTP Request和Response对象 并将
  • 通过zipkin来追踪调用链

    最近被一个问题困扰了两天 一个接口突然就特别慢 差不多要两分多钟才能返回 找问题一直没有头绪 项目采用的是springcloud微服务框架 服务之间的调用链特别的多 就算是看日志也不知道看哪一个日志 很难定位到问题所在 后来问同事 同事说看
  • 多媒体视频处理的一些基本概念

    1 帧 在最早的电影里面 一幅静止的图像被称做一 帧 Frame 影片里的画面是每一秒钟有24帧 为什么是24帧 这个数字是怎么来的 因为人类眼睛的视觉暂留现象正好符合每秒24帧的标准 所以用多也没有意义还会浪费电影胶片 增加成本 所以就是
  • python3 面向对象编程知识点介绍

    python3 面向对象编程介绍 简阶 第1章 面向对象设计 第2章 Python 对象 第3章 对象相似时 第4章 异常捕获 第5章 何时使用面向对象编程 第6章 Python 数据结构 第7章 Python 面向对象的捷径 python
  • 【数据库】往数据库中赋值时出现“Data too long for colum ‘XXX‘ at row 1”的解决方案之一

    说明 我直接用insert给表格的字段赋值时 某个变量出现了 Data too long for colum XXX at row 1 的错误 然后网上找了一堆教程 其实不对 首先你应该看 出现问题的这个字段是什么类型 出现问题的这个字段是
  • linux 网络编程

    linux网络编程 一 网络编程概述 1 概述 2 TCP UDP 3 端口号作用 二 字节序 三 socket编程步骤 四 linux提供的API简析 1 连接协议 2 连接地址 3 地址转换API 4 监听 5 连接 6 数据收发 7
  • Mysql 创建触发器 学习教程

    触发器 trigger 监视某种情况 并触发某种操作 触发器经常用于加强数据的完整性约束和业务规则等 触发器创建语法四要素 1 监视地点 table 2 监视事件 insert update delete 3 触发时间 after befo
  • 使用FORCE训练的脉冲神经网络中的监督学习(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1第一代神经网络 1 2 第二代神经网络 BP 神经网络 1 3 第三代神经网络 脉冲神经网络 2 运
  • CentOS下CGAL开发环境配置

    目录 1 必要的说明 1 1 简介 1 2 软件安装说明 2 依赖软件安装 2 1 GMP MPFR MPC GCC 2 2 Boost 2 3 CMake 2 4 Qt 3 CGAL 4 测试 4 1 构建一个Example 4 2 使用