因为一些工作需要Gmsh工具的帮助,故想采用Gmsh的第三方SDK供我在编程时使用,起先到gmsh官网下载了其提供的最新SDK包,但是由于某些原因导致我的项目无法成功使用其编译好的链接库,故打算自己重新编译该库供学习使用。本篇文章记录了我自编译Gmsh的全过程。
自行编译三方库需要用到Cmake工具,这里我用的是Cmake的Gui程序,工具可以自行到Cmake官网去下载。同时,我们还要准备一份gmsh的源码,也是到gmsh的官网去下载(注意:gmsh官网可能屏蔽了国内IP,故需要‘其他’方法访问)。
上述准备工作做好以后,我们就开始进行编译工作了。首先,在电脑的合适位置(尽量避免中文以免出现各种编码问题)新建一个目录,这个目录存放我们下载好的Gmsh源码,下文统一称为包含目录,这里我创建的包含目录叫做gmsh。如下图所示:
然后再新建一个空目录,作为我们的编译目录,用于存放编译后的文件,这里我的编译目录叫做lib_gmsh。注意:该目录此时应当是空的,这里我有文件是因为我此前已经编译好了。为了更好的演示,这里我用一个新的目录gmsh-sdk来作为编译目录。
然后打开我们的Cmake工具,其界面如图所示:
分别在第一栏和第三栏输入我们的包含目录和编译目录(如上图),勾选Grouped和Advanced选项。然后我们打开包含目录gmsh,找到其中的CMakeLists.txt文件打开,找到如下图所示这一行,并将其注释掉。因为这里我们没有用到Fortran故如不注释掉,下一步configure就会出错。
然后点击configure,出现下面这样的配置面板:
VS版本选与自己一致的即可,我使用的是2019,第二栏平台默认为x64不用管,其他也默认不动,点击finish开始config。出现下面这样的界面提示代表config成功:
然后在左上角的search栏内搜索enable进行链接库的配置选项,这里的勾选至关重要,决定了最后生成的链接库是否是我们所需要的。
首先,在ENABLE_BUILD_LIB和ENABLE_BUILD_DYNAMIC后面打勾(如上图所示),勾选这两个选项最后才能生成lib和dll库文件。接下来的勾选按照下面图片操作(注意:没有勾选的尽量不要擅自勾选,否则最后会因为缺少某些文件导致编译失败,这里只要是在gmsh源码的src目录下出现的内容,都可以勾选进行编译,比如mesh、parser、plugins等):
然后点击generate,出现如下界面提示代表成功:
此时我们可以关闭Cmake了,打开编译目录,发现其中有了一些文件,找到gmsh.sln工程文件用VS打开它。
在上方点击重新生成解决方案:
途中发现了错误,提示为“常量中包含换行符”,定位出错的源文件位置如下图所示:
这里是因为我的主机名(user)包含了中文所以出错,将该文件编码格式改一下,原来是utf-8,我将其改为GB2312,适应简体中文。更改文件编码是利用高级文件保存选项,具体方法这里不作赘述。
修改后再次重新生成解决方案,成功!此时我们再回到编译目录,发现产生了一个叫做Debug的文件夹,进入发现其中就包含了我们所需要的链接库gmsh.lib和gmsh.dll。
接下来我们创建一个项目来调用一下上面的库是否可以放心使用,这里我用VS2019新建了一个项目名叫test。在项目属性里面配置好相关内容,具体如下图所示:
再放入下面这串代码:
#include <gmsh.h>
int main(int argc, char** argv)
{
// 初始化gmsh库
gmsh::initialize();
// 创建一个新的gmsh模型
gmsh::model::add("example");
// 创建一个正方形的边界
double lc = 1.0; // 网格的特征长度
gmsh::model::geo::addPoint(0, 0, 0, lc, 1);
gmsh::model::geo::addPoint(1, 0, 0, lc, 2);
gmsh::model::geo::addPoint(1, 1, 0, lc, 3);
gmsh::model::geo::addPoint(0, 1, 0, lc, 4);
gmsh::model::geo::addLine(1, 2, 1);
gmsh::model::geo::addLine(2, 3, 2);
gmsh::model::geo::addLine(3, 4, 3);
gmsh::model::geo::addLine(4, 1, 4);
gmsh::model::geo::addCurveLoop({ 1, 2, 3, 4 }, 1);
gmsh::model::geo::addPlaneSurface({ 1 }, 1);
// 生成网格
gmsh::model::mesh::generate(2);
// 将模型写入文件
gmsh::write("example.msh");
// 退出gmsh库
gmsh::finalize();
return 0;
}
如图:
注意将上述测试项目的调试平台设为x64而不是32或者x86,因为我们的链接库编译的时候是使用的默认x64平台。点击运行,发现运行中途也出现错误,提示无法找到gmsh.dll文件,这是因为我们的项目x64调试文件目录下没有这个文件,故无法链接到该运行库,将前面生成的gmsh.dll拷贝到此。如下图所示:
再运行,发现测试成功了!
测试代码中写入的“example.msh”网格文件也成功地写入到了目录下,至此,gmsh库自编译成功!