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开发环境配置 的相关文章

  • 打开和关闭附加窗口 (QML)

    目前我有一个通过以下方式打开的窗口 property variant win Button id testButton MouseArea onClicked var component Qt createComponent test qm
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • 在 QtCreator 中使用 .pro 和 .pri 正确(树)显示 Qt 项目

    是否可以使用项目包含文件 pri 显示不止一个额外级别 例如如果 pro文件包括 pri文件包含两个 pri files pro pri pri pri 在 QtCreator 项目 中显示具有误导性 pro pri pri pri 它根本
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • 如何声明一个带有成员函数指针的函数

    我有一个类 其中的成员变量指向库对象 class myClassA private libraryClass libraryObject 该库类发出事件 以字符串为特征 并提供一种机制 允许客户端类指定在发出事件时应调用的成员函数 因此在m
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • 如何在针对 Windows XP 的情况下使用 VS2012 构建 Qt 4/5?

    我正在尝试使用 Visual Studio 2012 构建 Qt 4 8 5 Qt 5 2 1 针对 Windows XP SDK v7 1a 使用 VS2102 编译时 源代码与 SDK v7 1a 存在各种不兼容性 因此无法开箱即用 这
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目
  • 为什么 QT 设计器重新调整大小或不允许我缩小或展开小部件或按钮?

    很多时候 在使用 QT 设计器时 我发现自己需要通过缩小或扩展来调整事物的大小 每当我尝试这样做时 程序都不允许我这样做 而只是恢复到将对象放置在窗口中时给我的原始默认大小 无论我的布局如何 为什么要这样做 是否有可能改变这一点 以便我可以
  • 是否可以根据 QSlider 的位置来改变其手柄的颜色?

    我非常清楚如何通过样式表自定义 QSlider 但我想知道是否可以执行以下操作 我希望滑块的手柄从蓝色变为黄色 当设置在左侧时 它是蓝色的 设置在左侧时 它是蓝色的 当你将它向右移动时 它会出现从蓝色到黄色的渐变 如果可以通过样式表 如何实
  • Qt 相当于 .NET 数据绑定吗?

    Qt 中是否有相当于 NET 数据绑定的功能 我想使用引用数据库中特定实体的 QString 填充一些组合框和其他小部件 但是 如果我可以将数据绑定到这些字符串 而不是基于新的组合框选择再次查询数据库 或者基于构建我自己的将使用 QStri
  • 为什么动态 qml 对象的创建如此缓慢,有哪些合理的替代方案?

    我想要实现的目标类似于棋盘游戏 有一个100 100的网格 放在一个Item它驻留在一个Flickable 游戏板 的各个矩形都是 svg 图像 目前大约有 20 种 可能会增加到数百种 作为基准测试 我只是尝试用元素填充 世界 Compo
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • QT:模块“QtWebView”未安装

    我的操作系统是win10 QT版本是Qt5 7 mingw53 32 目标操作系统是win10 当我使用qmlscene执行qml文件时 发生了一些错误 qrc qml 3 模块 QtWebView 未安装 我的 qml 文件如下 impo
  • QML MouseArea 将事件传播到按钮

    我正在开发一个应用程序 其菜单类似于 Android 版 Gmail 收件箱应用程序菜单 基本上 当您按下按钮打开菜单时 它就会滑入视图 用户可以将其滑开或按菜单上的按钮 对于滑动我使用了代码SwipeArea from kovrov ht

随机推荐

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