因为一些工作需要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库自编译成功!

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐