起因
想用CGAL做一些关于mesh的操作,我的上游输出是一个用PLY文件存储的surface mesh,我希望将其转换为CGAL的格式。经过Google发现,较新的CGAL版本带有read_ply()
函数,而当前系统配套的CGAL版本并不支持,于是需要安装新的CGAL。How hard can it be?! 但是事实是,这花去了几乎一下午的时间。
本机系统
Ubuntu 18.04
cmake 3.16
Qt 5.9.5
clone repo
从CGAL的Github clone 到本地。
当前CGAL的版本是5.0.2,通过git checkout releases/CGAL-5.0.2切换到对应的tag上。
与本地project结合
在CGAL Github的页面上有INSTALL.md文件。内有如何将CGAL添加到本地project的方法。基本原理就是CGAL本身已经是header only的library了,所以只需要让cmake找到我们clone CGAL的位置即可。INSTALL.md内描述了如何运用cgal_create_cmake_script
脚本生成一个CMakeLists.txt,并且指出在执行cmake时需要指定CGAL的具体位置。在cgal_create_cmake_script
所生成的CMakeLists.txt最后,使用了一个名为create_single_source_cgal_program
的cmake函数,该函数貌似只能创建具有一个源文件的target。在简单Google之后,发现其实create_single_source_cgal_program
也可以指定多个源文件,只不过target名称会根据第一个指定的源文件进行配置。请参考这里。
把create_single_source_cgal_program
生成的CMakeLists.txt作为模板,编写一个新的CMakeLists.txt文件如下
cmake_minimum_required(VERSION 3.16)
project( TestCGAL5 )
set(CMAKE_CXX_STANDARD 14)
set(CGAL_DIR /path/to/cgal)
find_package(CGAL REQUIRED QUIET OPTIONAL_COMPONENTS Core )
add_executable(TestCGAL5 main.cpp)
target_link_libraries(TestCGAL5 ${CGAL_LIBRARIES})
此时我们调用CMake时不再需要指定CGAL的位置。
增加Qt支持
用于测试的程序(附录)需要用到CGAL提供的draw()
函数来绘制一个mesh,未对CMakeLists.txt做任何更改时,编译无问题,但运行时将会报出“Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined.” 的错误。
于是在首个cpp文件内加入了如下代码(参考这里)
#define CGAL_USE_BASIC_VIEWER
编译报错,报错内容与Qt相关。
这里真的要开始吐槽一下CGAL,文档真的是没有写如何正确的对Qt进行支持。
从文档里能找到的线索很有限,这里描述了CGAL需要使用到的Qt component。对于CMake,Qt有推荐的方式,参考这里。为了满足这些需求,除了Qt本身,某些系统库似乎也需要安装(参考这里和这里)
sudo apt-get install