Poisson Reconstruction 从源码编译总结

2020/03/12 Library

Poisson Reconstruction 是一个广泛用于从点云建 mesh 的算法。官网提供的代码并没有编译说明,在 Mac 编译时会遇到几个问题。这里总结一下它的使用的几个要点以及编译时遇到的错误。


官网:http://www.cs.jhu.edu/~misha/Code/PoissonRecon/Version8.0/#USAGE

官网提供了源码以及 Windows 可执行程序。

Mac 上从源码编译

源码中有 Makefile,因此使用 make 命令编译。

问题 1:Mac下安装程序出现 clang: error unsupported option ‘-fopenmp’

参考:Mac下安装程序出现clang: error unsupported option ‘-fopenmp’

这个通常是因为,Mac 中默认的 gcc 指向的是 clang 而不是真正的 gcc,而 clang 目前对 openmp 的支持是有问题的。

可以通过 gcc --version查看,可以看到类似这样:

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin19.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

可以看到,gcc 确实指向了 clang。而其实,Mac 本身是有安装 gcc 的,通常在 /usr/local/Cellar/gcc/<version>路径下(笔者的是 9.2 版本),并且还会复制到 /usr/local/bin/gcc-9路径下。而默认的 gcc 却是在 /usr/bin/gcc位置(注意两个路径的区别)。不妨分别验证一下。 /usr/local/bin/gcc-9 --version返回的应该是这样:

$ /usr/local/bin/gcc-9 --version
gcc-9 (Homebrew GCC 9.2.0_3) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

/usr//bin/gcc --version返回的应该和上面的 gcc --version 返回的一样。同理,真正的 g++ 的路径和 gcc 完全一致。

okay,找到了真正的 gcc 和 g++ 的路径后,解决该问题的方法很简单,打开你的 Makefile 文档,修改 CC 和 CXX 的路径为真正的 gcc 和 g++ 路径即可:

CC=/usr/local/bin/gcc-9
CXX=/usr/local/bin/g++-9

然后再 make 就行了。

如果你使用的是 CMake,可以在 CMakeLists.txt 中修改:

SET(CMAKE_C_COMPILER /usr/local/bin/gcc-9)
SET(CMAKE_CXX_COMPILER /usr/local/bin/g++-9)

又或者直接将这两个 flags 作为输入参数传入:

cmake -DCMAKE_C_COMPILER=/usr/local/bin/gcc-9 -DCMAKE_CXX_COMPILER=/usr/local/bin/g++-9 ..

问题 2:某个函数 FunctionIndex 的编译错误

可能会遇到如下所示的错误:

Src/MultiGridOctreeData.WeightedSamples.inl: In member function 'V Octree<Real>::_Evaluate(const DenseNodeData<C, FEMDegree>&, Point3D<Real>, const BSplineData<DataDegree>&, const ConstPointSupportKey<DataDegree>&) const':
Src/MultiGridOctreeData.WeightedSamples.inl:360:28: error: no matching function for call to 'Octree<Real>::FunctionIndex(const TreeOctNode*&, int [3]) const'
  360 |    FunctionIndex( n , fIdx );

解决方法是,打开出错的 Src/MultiGridOctreeData.WeightedSamples.inl文件,找到 360 行,可以看到是这样的:

			FunctionIndex( n , fIdx );

将其修改为:

			FunctionIndex< DataDegree >( n , fIdx );

即,这个 template function 使用方法有问题,增加了类别后就行了。

Search

    Table of Contents