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 使用方法有问题,增加了类别后就行了。