CGAL / cgal

The public CGAL repository, see the README below
https://github.com/CGAL/cgal#readme
Other
4.98k stars 1.39k forks source link

Compilation Error in "Polygon_mesh_processing/mesh_slicer_example.cpp" #4889

Closed samartIT closed 4 years ago

samartIT commented 4 years ago

Issue Details

Compilation error. I am trying to use mesh-slicer and found this example. Unfortunately, it can't compile, see below full error.

Undefined symbols for architecture x86_64:
  "___gmpn_copyi", referenced from:
      CGAL::Mpzf::Mpzf(CGAL::Mpzf const&) in main.cpp.o
  "___gmpq_add", referenced from:
      boost::multiprecision::backends::eval_add(boost::multiprecision::backends::gmp_rational&, boost::multiprecision::backends::gmp_rational const&) in main.cpp.o
  "___gmpq_clear", referenced from:
      boost::multiprecision::backends::gmp_rational::~gmp_rational() in main.cpp.o
  "___gmpq_cmp", referenced from:
      boost::multiprecision::backends::gmp_rational::compare(boost::multiprecision::backends::gmp_rational const&) const in main.cpp.o
  "___gmpq_init", referenced from:
      boost::multiprecision::backends::gmp_rational::gmp_rational() in main.cpp.o
      boost::multiprecision::backends::gmp_rational::operator=(boost::multiprecision::backends::gmp_rational const&) in main.cpp.o
      boost::multiprecision::backends::gmp_rational::operator=(double) in main.cpp.o
      boost::multiprecision::backends::gmp_rational::gmp_rational(boost::multiprecision::backends::gmp_rational const&) in main.cpp.o
      boost::multiprecision::backends::gmp_rational::operator=(long) in main.cpp.o
  "___gmpq_mul", referenced from:
      boost::multiprecision::backends::eval_multiply(boost::multiprecision::backends::gmp_rational&, boost::multiprecision::backends::gmp_rational const&, boost::multiprecision::backends::gmp_rational const&) in main.cpp.o
  "___gmpq_set", referenced from:
      boost::multiprecision::backends::gmp_rational::operator=(boost::multiprecision::backends::gmp_rational const&) in main.cpp.o
      boost::multiprecision::backends::gmp_rational::gmp_rational(boost::multiprecision::backends::gmp_rational const&) in main.cpp.o
  "___gmpq_set_d", referenced from:
      boost::multiprecision::backends::gmp_rational::operator=(double) in main.cpp.o
  "___gmpq_set_si", referenced from:
      boost::multiprecision::backends::gmp_rational::operator=(long) in main.cpp.o
  "___gmpq_swap", referenced from:
      boost::multiprecision::backends::gmp_rational::swap(boost::multiprecision::backends::gmp_rational&) in main.cpp.o
      boost::multiprecision::backends::gmp_rational::operator=(boost::multiprecision::backends::gmp_rational&&) in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Source Code

I copy the code from example: Polygon_mesh_processing/mesh_slicer_example.cpp I have tried to figure which line makes this error and found that "slicer(K::Plane_3(0, 0, 1, -0.4), std::back_inserter(polylines));" cause this error.

here is the source code

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/AABB_halfedge_graph_segment_primitive.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/Polygon_mesh_slicer.h>
#include <fstream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Surface_mesh<K::Point_3> Mesh;
typedef std::vector<K::Point_3> Polyline_type;
typedef std::list< Polyline_type > Polylines;
typedef CGAL::AABB_halfedge_graph_segment_primitive<Mesh> HGSP;
typedef CGAL::AABB_traits<K, HGSP>    AABB_traits;
typedef CGAL::AABB_tree<AABB_traits>  AABB_tree;
int main(int argc, char* argv[])
{
  const char* filename = (argc > 1) ? argv[1] : "data/eight.off";
  std::ifstream input(filename);
  Mesh mesh;
  if (!input || !(input >> mesh) || mesh.is_empty()
             || !CGAL::is_triangle_mesh(mesh)) {
    std::cerr << "Not a valid input file." << std::endl;
    return 1;
  }
  // Slicer constructor from the mesh
  CGAL::Polygon_mesh_slicer<Mesh, K> slicer(mesh); 
  Polylines polylines;
  slicer(K::Plane_3(0, 0, 1, -0.4), std::back_inserter(polylines));
  std::cout << "At z = 0.4, the slicer intersects "
            << polylines.size() << " polylines" << std::endl;
  polylines.clear();
  slicer(K::Plane_3(0, 0, 1, 0.2), std::back_inserter(polylines));
  std::cout << "At z = -0.2, the slicer intersects "
            << polylines.size() << " polylines" << std::endl;
  polylines.clear();
  // Use the Slicer constructor from a pre-built AABB_tree
  AABB_tree tree(edges(mesh).first, edges(mesh).second, mesh);
  CGAL::Polygon_mesh_slicer<Mesh, K> slicer_aabb(mesh, tree);
  slicer_aabb(K::Plane_3(0, 0, 1, -0.4), std::back_inserter(polylines));
  std::cout << "At z = 0.4, the slicer intersects "
            << polylines.size() << " polylines" << std::endl;
  polylines.clear();
  return 0;
}

Environment

janetournois commented 4 years ago

There is an empty #include instruction at the beginning of your code. You should first try to remove it. Then, did you use CMake to compile the example?

sloriot commented 4 years ago

I think it's the pb we already observed with boost mp and MacOS. @danston you already have a fix for that right?

@janetournois the #include was probably an issue with the formatting that @MaelRL fixed in an edit.

lrineau commented 4 years ago

@samartIT We see the .cpp source code, but the build system that tried to create the binary. It seems your linker is reporting errors because libgmp is not in the set of binaries to link, hence the missing symbols.

samartIT commented 4 years ago

There is an empty #include instruction at the beginning of your code. You should first try to remove it. Then, did you use CMake to compile the example?

Oh poor me. I did follow CMake by CGAL tutorial. Everything works now. Thank you.