编译CGAL

2023-11-11

抛弃CMake
长期以来,我一直以为编译CGAL是一项十分艰巨的任务。直到有一天,我决定彻底抛弃繁复的CMake,转而使用简简单单的QMake。这才发现,编译CGAL是如此简单的一个事儿。

注:本文所指的CGAL是指CGAL4.14及之后的版本。

理解CGAL编译依赖
CGAL百分之九十九都是头文件,无需编译,只有1%的内容需要编译。而使用C++17编译时,CGAL只依赖Boost头文件。没错,只需要Boost文件,不需要编译Boost。而那些什么GMP啦,什么MPFR啦,什么Qt啦,编译CGAL的时候是不需要的,只有当使用CGAL的时候才需要。

读者只需要下载并解压缩CGAL源代码到一个不包含空格和非ASCII码的目录,我们姑且叫它[CGAL_ROOT];

在[CGAL_ROOT]目录下建立一个目录,比如叫做“CGAL_CONFIG/CGAL”;

建立文件“CGAL_CONFIG/CGAL/version.h”并键入内容:

#ifndef CGAL_VERSION_H
#define CGAL_VERSION_H

#define CGAL_VERSION 4.14-I-900
#define CGAL_VERSION_NR 1041400900
#define CGAL_SVN_REVISION 99999

#define CGAL_RELEASE_DATE 20190701

#include <CGAL/version_macros.h>

#endif

建立文件“CGAL_CONFIG/CGAL/compiler_config.h”并键入内容:

#if defined(_MSC_VER)
    #define CGAL_CFG_FPU_ROUNDING_MODE_UNWINDING_VC_BUG 1
    #define CGAL_CFG_MATCHING_BUG_6 1
#endif

#define CGAL_USE_GMP 1
#define CGAL_USE_MPFR 1
#define CGAL_BUILD_SHARED_LIBS 1

新建一个文件“[CGAL_ROOT]/build_all.cpp”并键入内容:

#include "Geomview/src/CGAL/Geomview_stream.cpp"
#include "Intersections_2/src/CGAL/Bbox_2_intersections.cpp"
#include "Kernel_23/src/CGAL/kernel.cpp"
#include "Number_types/src/CGAL/Interval_arithmetic.cpp"
#include "Number_types/src/CGAL/test_FPU_rounding_mode.cpp"
#include "Profiling_tools/src/CGAL/Real_timer.cpp"
#include "Profiling_tools/src/CGAL/Timer.cpp"
#include "Random_numbers/src/CGAL/Random.cpp"
#include "STL_Extension/src/CGAL/assertions.cpp"
#include "Stream_support/src/CGAL/Color.cpp"
#include "Stream_support/src/CGAL/File_header_OFF.cpp"
#include "Stream_support/src/CGAL/File_header_extended_OFF.cpp"
#include "Stream_support/src/CGAL/File_scanner_OFF.cpp"
#include "Stream_support/src/CGAL/File_writer_OFF.cpp"
#include "Stream_support/src/CGAL/File_writer_VRML_2.cpp"
#include "Stream_support/src/CGAL/File_writer_inventor.cpp"
#include "Stream_support/src/CGAL/File_writer_wavefront.cpp"
#include "Stream_support/src/CGAL/io.cpp"

没错,只需要编译“build_all.cpp”这么一个文件就行了,编译时顺便多定义一个宏“CGAL_EXPORTS”。其它根本什么都不需要。

比如,读者建立一个文件“[CGAL_ROOT]/build_cgal.pro”并键入内容:

TEMPLATE = lib
TARGET   = mycgal
 
DEFINES      *= CGAL_EXPORTS
INCLUDEPATH += $$PWD/CGAL_CONFIG
INCLUDEPATH += C:/boost/boost_1_70_0
SOURCES     += $$PWD/build_all.cpp
 
INCLUDEPATH += $$PWD/AABB_tree/include
INCLUDEPATH += $$PWD/AABB_tree/include
INCLUDEPATH += $$PWD/Advancing_front_surface_reconstruction/include
INCLUDEPATH += $$PWD/Algebraic_foundations/include
INCLUDEPATH += $$PWD/Algebraic_kernel_d/include
INCLUDEPATH += $$PWD/Algebraic_kernel_for_circles/include
INCLUDEPATH += $$PWD/Algebraic_kernel_for_spheres/include
INCLUDEPATH += $$PWD/Alpha_shapes_2/include
INCLUDEPATH += $$PWD/Alpha_shapes_3/include
INCLUDEPATH += $$PWD/Apollonius_graph_2/include
INCLUDEPATH += $$PWD/Arithmetic_kernel/include
INCLUDEPATH += $$PWD/Arrangement_on_surface_2/include
INCLUDEPATH += $$PWD/Barycentric_coordinates_2/include
INCLUDEPATH += $$PWD/BGL/include
INCLUDEPATH += $$PWD/Boolean_set_operations_2/include
INCLUDEPATH += $$PWD/Bounding_volumes/include
INCLUDEPATH += $$PWD/Box_intersection_d/include
INCLUDEPATH += $$PWD/Cartesian_kernel/include
INCLUDEPATH += $$PWD/CGAL_Core/include
INCLUDEPATH += $$PWD/CGAL_ImageIO/include
INCLUDEPATH += $$PWD/CGAL_ipelets/include
INCLUDEPATH += $$PWD/Circular_kernel_2/include
INCLUDEPATH += $$PWD/Circular_kernel_3/include
INCLUDEPATH += $$PWD/Circulator/include
INCLUDEPATH += $$PWD/Classification/include
INCLUDEPATH += $$PWD/Combinatorial_map/include
INCLUDEPATH += $$PWD/Cone_spanners_2/include
INCLUDEPATH += $$PWD/Convex_decomposition_3/include
INCLUDEPATH += $$PWD/Convex_hull_2/include
INCLUDEPATH += $$PWD/Convex_hull_3/include
INCLUDEPATH += $$PWD/Convex_hull_d/include
INCLUDEPATH += $$PWD/Distance_2/include
INCLUDEPATH += $$PWD/Distance_3/include
INCLUDEPATH += $$PWD/Envelope_2/include
INCLUDEPATH += $$PWD/Envelope_3/include
INCLUDEPATH += $$PWD/Filtered_kernel/include
INCLUDEPATH += $$PWD/Generalized_map/include
INCLUDEPATH += $$PWD/Generator/include
INCLUDEPATH += $$PWD/Geomview/include
INCLUDEPATH += $$PWD/GraphicsView/include
INCLUDEPATH += $$PWD/HalfedgeDS/include
INCLUDEPATH += $$PWD/Hash_map/include
INCLUDEPATH += $$PWD/Heat_method_3/include
INCLUDEPATH += $$PWD/Homogeneous_kernel/include
INCLUDEPATH += $$PWD/Hyperbolic_triangulation_2/include
INCLUDEPATH += $$PWD/Inscribed_areas/include
INCLUDEPATH += $$PWD/Installation/include
INCLUDEPATH += $$PWD/Interpolation/include
INCLUDEPATH += $$PWD/Intersections_2/include
INCLUDEPATH += $$PWD/Intersections_3/include
INCLUDEPATH += $$PWD/Interval_skip_list/include
INCLUDEPATH += $$PWD/Interval_support/include
INCLUDEPATH += $$PWD/Inventor/include
INCLUDEPATH += $$PWD/Jet_fitting_3/include
INCLUDEPATH += $$PWD/Kernel_23/include
INCLUDEPATH += $$PWD/Kernel_d/include
INCLUDEPATH += $$PWD/LEDA/include
INCLUDEPATH += $$PWD/Linear_cell_complex/include
INCLUDEPATH += $$PWD/Matrix_search/include
INCLUDEPATH += $$PWD/Mesher_level/include
INCLUDEPATH += $$PWD/Mesh_2/include
INCLUDEPATH += $$PWD/Mesh_3/include
INCLUDEPATH += $$PWD/Minkowski_sum_2/include
INCLUDEPATH += $$PWD/Minkowski_sum_3/include
INCLUDEPATH += $$PWD/Modifier/include
INCLUDEPATH += $$PWD/Modular_arithmetic/include
INCLUDEPATH += $$PWD/Nef_2/include
INCLUDEPATH += $$PWD/Nef_3/include
INCLUDEPATH += $$PWD/Nef_S2/include
INCLUDEPATH += $$PWD/NewKernel_d/include
INCLUDEPATH += $$PWD/Number_types/include
INCLUDEPATH += $$PWD/OpenNL/include
INCLUDEPATH += $$PWD/Optimal_transportation_reconstruction_2/include
INCLUDEPATH += $$PWD/Optimisation_basic/include
INCLUDEPATH += $$PWD/Partition_2/include
INCLUDEPATH += $$PWD/Periodic_2_triangulation_2/include
INCLUDEPATH += $$PWD/Periodic_3_mesh_3/include
INCLUDEPATH += $$PWD/Periodic_3_triangulation_3/include
INCLUDEPATH += $$PWD/Periodic_4_hyperbolic_triangulation_2/include
INCLUDEPATH += $$PWD/Point_set_2/include
INCLUDEPATH += $$PWD/Point_set_3/include
INCLUDEPATH += $$PWD/Point_set_processing_3/include
INCLUDEPATH += $$PWD/Point_set_shape_detection_3/include
INCLUDEPATH += $$PWD/Poisson_surface_reconstruction_3/include
INCLUDEPATH += $$PWD/Polygon/include
INCLUDEPATH += $$PWD/Polygon_mesh_processing/include
INCLUDEPATH += $$PWD/Polyhedron/include
INCLUDEPATH += $$PWD/Polyhedron_IO/include
INCLUDEPATH += $$PWD/Polyline_simplification_2/include
INCLUDEPATH += $$PWD/Polynomial/include
INCLUDEPATH += $$PWD/Polytope_distance_d/include
INCLUDEPATH += $$PWD/Principal_component_analysis/include
INCLUDEPATH += $$PWD/Principal_component_analysis_LGPL/include
INCLUDEPATH += $$PWD/Profiling_tools/include
INCLUDEPATH += $$PWD/Property_map/include
INCLUDEPATH += $$PWD/QP_solver/include
INCLUDEPATH += $$PWD/Random_numbers/include
INCLUDEPATH += $$PWD/Ridges_3/include
INCLUDEPATH += $$PWD/Scale_space_reconstruction_3/include
INCLUDEPATH += $$PWD/SearchStructures/include
INCLUDEPATH += $$PWD/Segment_Delaunay_graph_2/include
INCLUDEPATH += $$PWD/Segment_Delaunay_graph_Linf_2/include
INCLUDEPATH += $$PWD/Set_movable_separability_2/include
INCLUDEPATH += $$PWD/Skin_surface_3/include
INCLUDEPATH += $$PWD/Snap_rounding_2/include
INCLUDEPATH += $$PWD/Solver_interface/include
INCLUDEPATH += $$PWD/Spatial_searching/include
INCLUDEPATH += $$PWD/Spatial_sorting/include
INCLUDEPATH += $$PWD/STL_Extension/include
INCLUDEPATH += $$PWD/Straight_skeleton_2/include
INCLUDEPATH += $$PWD/Stream_lines_2/include
INCLUDEPATH += $$PWD/Stream_support/include
INCLUDEPATH += $$PWD/Subdivision_method_3/include
INCLUDEPATH += $$PWD/Surface_mesh/include
INCLUDEPATH += $$PWD/Surface_mesher/include
INCLUDEPATH += $$PWD/Surface_mesh_approximation/include
INCLUDEPATH += $$PWD/Surface_mesh_deformation/include
INCLUDEPATH += $$PWD/Surface_mesh_parameterization/include
INCLUDEPATH += $$PWD/Surface_mesh_segmentation/include
INCLUDEPATH += $$PWD/Surface_mesh_shortest_path/include
INCLUDEPATH += $$PWD/Surface_mesh_simplification/include
INCLUDEPATH += $$PWD/Surface_mesh_skeletonization/include
INCLUDEPATH += $$PWD/Surface_sweep_2/include
INCLUDEPATH += $$PWD/TDS_2/include
INCLUDEPATH += $$PWD/TDS_3/include
INCLUDEPATH += $$PWD/Testsuite/include
INCLUDEPATH += $$PWD/Three/include
INCLUDEPATH += $$PWD/Triangulation/include
INCLUDEPATH += $$PWD/Triangulation_2/include
INCLUDEPATH += $$PWD/Triangulation_3/include
INCLUDEPATH += $$PWD/Union_find/include
INCLUDEPATH += $$PWD/Visibility_2/include
INCLUDEPATH += $$PWD/Voronoi_diagram_2/include

然后,读者用QtCreator打开并编译,CGAL就编译完成。

使用CGAL
使用CGAL只需要多定义一个宏“CGAL_NO_AUTOLINK”,去掉编译期的宏“CGAL_EXPORTS”,即可。好了,给个例子吧。

TEMPLATE = app
TARGET   = test_cgal

LIBS += -L"<MYCGAL PATH>" -lmycgal
LIBS += -L"<GMP PATH>" -lgmp
LIBS += -L"<MPFR PATH>" -lmpfr
LIBS += -L"<BOOST PATH>" –lboost_thread
LIBS += -L"<BOOST PATH>" –lboost_system

SOURCES     += $$PWD/test_main.cpp

DEFINES      *= CGAL_NO_AUTOLINK
INCLUDEPATH += $$PWD/CGAL_CONFIG
INCLUDEPATH += C:/boost/boost_1_70_0

INCLUDEPATH += $$PWD/AABB_tree/include

……
虽然例子里面要求导入GMP,MPFR以及Boost Thread和Boost System。但实际上对于C++17来说Boost Thread以及Boost System几乎是不需要的。而对于一些简单的无需高精度数字的算法,GMP和MPFR也是不需要的。

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

编译CGAL 的相关文章

随机推荐

  • 内存泄漏的场景

    当然可以 以下是每个场景的详细例子以及解决方法 未被释放的全局变量 例子 function leakMemory globalVar new Array 1000000 join leakMemory 解决方法 使用var let cons
  • 知乎爬虫(一)

    项目github地址 https github com Lee Jiazheng zhihu spider 知乎作为一个内容平台 有大量的新奇内容值得我们爬取 承受前人诸多知识 所以也写点东西为初学者提供一个学习的途径 爬虫 就是在一张大网
  • BUCK电源芯片BST引脚100nF电容的作用

    BUCK电源芯片大部分都有一个BOOT或者BST的引脚 这个引脚一般通过一个100nF的电容接到我们的开关输出引脚SW 那么大家知道这个100nF电容的作用吗 首先大家来看下BUCK芯片BOOT和SW引脚的内部结构 一般是由两个NMOS组成
  • finally用法

    一 finally是否执行 1 只有与 finally 相对应的 try 语句块得到执行的情况下 finally 语句块才会执行 当finally 相对应的 try 语句块之前 已经抛出错误 或者已经返回 return 就不会执行final
  • git查询和设置用户名及邮箱

    由于从原来的旧机子换到了新机子 很多东西都需要重新来 包括git 在vscode终端中安装了git 也ssh连到了远程的仓库 以为一切都ok了 在本地完成任务要推到远程时 告诉我说远程不知道我的身份 需要指明用户名和邮箱 我是个不太记东西的
  • AI算法实现与云平台应用

    陈迪豪 第四范式先知平台架构师 个人兴趣广泛 在开源社区比较活跃 维护了1600 star的容器Web管理平台Seagull 大二加入了小米做Android移动端开发 然后有幸学习到后端基础架构技术 参与了HBase ZooKeeper等社
  • 线程通信例题(12A34B56C.....5152Z)/ 生产者消费者面包超市...

    两个线程实现 一个线程专门打印数字 一个线程专门打印字母12A34B56C78D 5152Z public class Test public static void main String args Resource resource n
  • n行Python代码系列:两行代码将JSON文本转换成标准字典类型

    老猿Python博文目录 https blog csdn net LaoYuanPython article details 98245036 一 引言 最近看到好几篇类似 n行Python代码 的博文 看起来还挺不错 简洁 实用 传播了知
  • 大数据技术——VMbox的安装和网络配置

    大数据实训案例 实验报告 题目 大数据实验环境搭建 姓名 xxx 学号 xxxxxxx 实验日期 2023 x x 一 实验目的 1 掌握Linux操作系统的安装和使用方法 2 掌握hadoop的安装和使用方法 二 实验平台 操作系统 Ub
  • [USACO08FEB]修路Making the Grade

    题目链接 走这里 题目分析 考虑绝对值的几何意义 显然 b 里的数一定在 a 里出现过 离不离散化问题不大 用下标作第二位状态就行 设 dp i j 表示第 i 个数 高度为 a j 时的最优解 方程见代码 代码 include
  • Spring第38篇:定时器详解(@Scheduled & @EnableScheduling)

    Spring中 Scheduled EnableScheduling 这2个注解 可以用来快速开发定时器 使用特别的简单 如何使用 用法 1 需要定时执行的方法上加上 Scheduled注解 这个注解中可以指定定时执行的规则 稍后详细介绍
  • OSS实现文件上传

    本文主要讲解mall整合OSS实现文件上传的过程 采用的是服务端签名后前端直传的方式 文章目录 OSS OSS中的相关概念 OSS的相关设置 开通OSS服务 创建存储空间 跨域资源共享 CORS 的设置 服务端签名后前端直传的相关说明 流程
  • python3 GUI- 登陆界面

    python3 GUI 登陆界面 from tkinter import root Tk def Show root1 Tk if En get user and En1 get 123 Label root1 text 登陆成功 bg G
  • 全新防火墙6.0 DHCP线路上网配置

    一 组网需求 外网接口使用DHCP 内网为192 168 1 0 24网段 实现基本上网功能 二 网络拓扑 三 配置要点 1 配置接口 wan1口 务必勾选 从服务器重新得到网关 这样dhcp地址获取成功后设备会自动生成默认路由 无需手动配
  • 详细记录Pycharm配置已安装好的Conda虚拟环境

    当安装好conda环境之后 想要在Pycharm中使用 那么就要在Pycharm中导入 我这里使用的pycharm professional 2023 2这个版本 下面是详细步骤 1 打开File gt Settings 2 找到Proje
  • 从0开始搭建高仿华为云教育课堂官网(一)创建项目和搭建导航栏

    之前上过一些华为云的前端教育课程 最终考核是以vue为基础搭建一个华为云教育课堂的官网 网址如下 https classroom devcloud huaweicloud com home 下面记录一下搭建网站的全过程 使用vuecli 4
  • android 杀死三方app

    这是杀死后台应用 并且非保护程序 非系统程序 1 ActivityManager am ActivityManager context getSystemService Context ACTIVITY SERVICE Log i kill
  • JQuery 判断访问的浏览器是pc还是手机

    摘要 以下代码用于JQuery判断访问的浏览器的类型 判断访问类型是电脑还是手机 author 2017年9月27日 function var mobile flag isMobile true为PC端 false为手机端 if mobil
  • c语言求一个字符数的补码,C语言-数据类型(原码、反码、补码)

    1 原码 在数值前直接加一符号位的表示法 例如 符号位 数值位 7 原 0 0000111 B 7 原 1 0000111 B 注意 a 数0的原码有两种形式 0 原 00000000B 0 原 10000000B b 8位二进制原码的表示
  • 编译CGAL

    抛弃CMake 长期以来 我一直以为编译CGAL是一项十分艰巨的任务 直到有一天 我决定彻底抛弃繁复的CMake 转而使用简简单单的QMake 这才发现 编译CGAL是如此简单的一个事儿 注 本文所指的CGAL是指CGAL4 14及之后的版