Skip to content

编译安装

1 window

windos**下安装**cgal 如果没有其他需要(cmake 默认设置),需要准备三个库:gmpmpfrboost。如果需要其他设置的话,看需求增加其他库,我需要**eigen 3**,这里以**eigen 3**为例如何增加新的模块。如果你需要其他的类似。(感觉这种开源库在 windos 下玩对于我这种菜鸟来说就是天坑,使用时候各种小问题)

1.1 cmake 配置

根据上边介绍,我们需要准备:
- cgal 安装包(现在版本是 5.02,我原来工程是用的 4.14,搬家到 windos 我就不用最新版了)

https://github.com/CGAL/cgal/releases

下载**setup.exe** 或者**Source Code**。两个区别不大,就是没有编译好的**gmp** 和**mpfr**。如果你下载 exe,那么就不用再下载这两个了。

gmp https://gmplib.org/

mpfr https://www.mpfr.org/

为了截个图安装图,我下载的 5.02。这里看个人,我不喜欢加一堆系统路径,所有这种需要编译的库,一律没有加系统路径。

  • boost 下载安装就行,这里有编译好的版本,如果没有合适的要自己编译

https://sourceforge.net/projects/boost/files/boost-binaries/1.72.0/

  • eigen 3 下载编译后的就可以

http://eigen.tuxfamily.org/index.php?title=Main_Page

1.2 编译 CGAL

  1. 按照上部应该是准备好了几个东西 C:\local\boost_1_72_0
  2. 打开 cmake-gui 并设置
  3. vs 编译一下(debug 和 release)
  4. 编译完成你的静态库和动态库就都好了


1.3 测试、使用

怎么说吧,基本上 windos 下库编译完了都是让你放到系统 path 里。为了方便找所以我只加了一个 WorkDLL,把刚才编译好的放进去。(cgal debug 和 release 名称不同,一块放就行,如果是相同的库,只放 release)

  • 使用(静态链接),如果动态的话 **target_link_libraries**里加-l,在增加 dll 的路径。

set(CGAL_DIR  "D:/lib/CGAL/bulid")
find_package(CGAL REQUIRED)
include(${CGAL_USE_FILE})
target_link_libraries(
    ${PROJECT_NAME}
    ${CGAL_LIBS}
    )

- 测试函数(自相交检测)
bool CgalSelfIntersection(const char *filename,
                          QList<quint32>  &self_intersected_list,
                          QList<quint32>  &self_intersected_delete_list) {
    typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
    typedef CGAL::Surface_mesh<K::Point_3>             Mesh;
    typedef boost::graph_traits<Mesh>::face_descriptor face_descriptor;
    namespace PMP = CGAL::Polygon_mesh_processing;
    using namespace std;
    ifstream input(filename);
    Mesh mesh;
    if (!input) {
        qWarning() << "off文件打开错误";
        return 0;
    }
    std::vector<K::Point_3> points;
    std::vector<std::vector<std::size_t> > polygons;
    if(!input || !CGAL::read_OFF(input, points, polygons) || points.empty()) {
        qWarning() << "Cannot open file ";
        return 0;
    }
    CGAL::Polygon_mesh_processing::orient_polygon_soup(points, polygons);
    CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(points, polygons, mesh);
    input.close();
    bool intersecting = PMP::does_self_intersect(mesh,
                        PMP::parameters::vertex_point_map(get(CGAL::vertex_point, mesh)));
    qDebug() << (intersecting ?
                 "存在自相交" : "不存在自相交");
    QVector<pair<face_descriptor, face_descriptor> > intersected_tris;
    PMP::self_intersections(mesh, back_inserter(intersected_tris));
    qDebug() << intersected_tris.size() << "对三角形相交";
    QVector<pair<face_descriptor, face_descriptor>>::iterator iter;
    for (iter = intersected_tris.begin(); iter != intersected_tris.end(); iter++) {
        self_intersected_list << iter->first << iter->second;
    }
    self_intersected_delete_list = self_intersected_list;
    return 1;
}

1.4 如何打包

上边 cmkae 里是静态链接,生成的 exe 需要 cgal 的 dll,在 cgal 编译的 bin 里把需要的 dll 跟自己生成的 exe 一起打包就好。

2 linux

官方说明 https://www.cgal.org/download.html

源码/安装包下载 https://github.com/CGAL/cgal/releases

我的镜像 https://pan.baidu.com/s/1o46NVDF-5faGFv5jZm44yg 密码: 83 re

2.1 供编译好的库,直接安装

Debian or Linux Mint 下安装

sudo apt-get install libcgal-dev
apt-get install libcgal-demo

ArchLinux 下安装

sudo pacman -S cgal

卸载

sudo apt-get remove libcgal-dev
sudo apt-get remove libcgal-demo

2.2 自己编译

自己编译的话下载这个(其他版本一样

我编译大概一分钟,一次成功,什么错误都没出现。我的环境:

ubuntu 18.04、qt 5.11.2、gcc 7

我原来特别烦开源库自己编译,总是各种错误.编译好多次各种不同的之后发现,其实 cmake 出错很好办,configure 过程中错误的话就是配置错误,make 过程中错误就是缺少库,去日志里看下少什么库,谷歌搜索下前五条一定有如何安装

make 成功后要不要 install,看你怎么用.我工程都是直接用 cmake 写的,所以不用安装了,编译好就行了

2.3 安装错误及解决办法

用新电脑重新编译发现还是有错误的,缺少各种库,有个很方便的办法,直接安装官方提供编译好的的库,让后自己编译源码,让后卸载官方提供库。如果不按这个顺序直接编译,反正就是少各种第三方库

  1. 错误 1

Could NOT find GMP (missing: GMP_LIBRARIES GMP_INCLUDE_DIR)
CMake Error at cmake/modules/CGAL_SetupDependencies.cmake:66 (message):
CGAL requires GMP to be found
Call Stack (most recent call first):
CMakeLists.txt:673 (include)

解决办法

安装 GMP
sudo apt-get install m 4 先安装 m 4
https://gmplib.org/ 官网下载
https://gmplib.org/manual/Installing-GMP.html 官方安装教程

./configure --enable-cxx
make
make check
sudo make install
  1. 错误 2

Could NOT find MPFR (missing: MPFR_LIBRARIES MPFR_INCLUDE_DIR)
CMake Error at cmake/modules/CGAL_SetupDependencies.cmake:66 (message):
CGAL requires MPFR to be found
Call Stack (most recent call first):
CMakeLists.txt:673 (include)

解决办法

git clone https://github.com/qnzhou/PyMesh.git
cd PyMesh
git submodule update --init
cd $PYMESH_PATH/third_party
mkdir build
cd build
cmake ..
make
make install

3 测试

用 qt 的话搞这种跨平台的很方便,直接新建纯 c++项目,用 cmake 管理不要用 qmake。

跑一下这段测试程序(官方案例第一个,为了方便理解我中文注释了下

如果用 qmake 或者 windos 下用 vs 的话(上一步需要 install),配置下 includes 路径和 lib 路径,vs 的话直接属性配置,添加路径就可以了。

  • qmake
INCLUDEPATH+=XXXX     .h路径
CONFIG(debug, debug|release):{
LIBS+=-LXXXXX    lib路径
-lxxxxd\
-lxxxxd
}else:CONFIG(release, debug|release):{
LIBS+=-LXXXXX    lib路径
-lxxxx\
-lxxxx
}
  • cmake
cmake_minimum_required(VERSION 3.1.0)
project(cgalc)

find_package(CGAL REQUIRED)
include(${CGAL_USE_FILE})

add_executable(${PROJECT_NAME} "main.cpp")

target_link_libraries(${PROJECT_NAME} ${CGAL_LIBS})
#include <iostream>
#include <CGAL/Simple_cartesian.h>

typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;

int main() {
    Point_2 p(1, 1), q(10, 10), m(5, 9);
    Segment_2 s(p, q);



    std::cout << "p位置:" << p << std::endl;
    std::cout << "q位置:" << q.x() << " " << q.y() << std::endl;
    std::cout << "m位置:" << m << std::endl;

    std::cout << "---------计算欧几里德距离的平方----------- " << std::endl;
    std::cout << "平方距离(p,q) = "
              << CGAL::squared_distance(p, q) << std::endl;

    std::cout << "---------计算欧几里德距离的平方----------- " << std::endl;
    std::cout << "平方距离(线段(p,q), m) = "
              << CGAL::squared_distance(s, m) << std::endl;

    std::cout << "---------判断共线----------- " << std::endl;
    std::cout << "p, q, m ";
    switch (CGAL::orientation(p, q, m)) {
    case CGAL::COLLINEAR:
        std::cout << "共线\n";
        break;
    case CGAL::LEFT_TURN:
        std::cout << "左侧\n";
        break;
    case CGAL::RIGHT_TURN:
        std::cout << "右侧\n";
        break;
    }

    std::cout << "---------计算中点----------- " << std::endl;
    std::cout << " 中点(p,q) = " << CGAL::midpoint(p, q) << std::endl;
    return 0;
}

输出结果

4 增加 Eigen3

4.1 问题

CGAL Eigen 3 XXXXXis not a class, struct, or union type 案例编译不成功

看 CGAL 官方说明,有表面平滑和表面补洞的案例.官方案例死活跑不通,总是报这两个错误,很抓狂
不跟我说哪里错了,就是一堆未声明.搜索好久终于找到有人跟我一样的错误,有人回复了解决办法.

XXXXXis not a class, struct, or union type typedef typename Sparse_linear_solver::Matrix Solver_matrix;

4.2 解决办法

安装 Eigen 3,这是一个用于矩阵和线性代数运算的计算机编程库.CGAL 安装文档有说明,

Poisson Surface Reconstruction Reference
Triangulated Surface Mesh Parameterization

这两个包中用到了 EIGEN,需要安装 eigen 库才可以
属于线性代数的 C++模板库。own 支持所有矩阵大小、各种矩阵分解方法和稀疏线性解算器。

在 cgal 中,eigen 在 poisson 曲面重建参考和三角化曲面网格参数化参考包中提供稀疏线性解算器。
此外,特征值分解还提供了奇异值分解,用于估计点采样曲面参考的局部微分性质,以及三角化曲面网格参考包上脊线和脐点的近似。

http://eigen.tuxfamily.org

4.3 Eigen 3 介绍

Eigen3官网

4.4 安装 EIGEN

sudo apt-get install libeigen 3-dev

这个我看了下以后我估计也用不到我就直接安装编译好的了.
自己编译去这里下载

http://eigen.tuxfamily.org/index.php?title=Main_Page

4.5 CGAL + EIGEN

find_package(Eigen 3 REQUIRED)
include( ${EIGEN 3_USE_FILE} )