GCC编译UDF和gdb调试UDF
Fluent版本:19.0
前面我们介绍过使用VS来编译和调试UDF,其实我们也可以用GCC来编译UDF、gdb调试UDF。本次介绍的方法更具有通用性,也适用于Linux下Fluent的UDF编译和调试
首先我们介绍使用GCC来编译UDF
我习惯使用TDM-GCC,下载地址为:
http://tdm-gcc.tdragon.net/download

下面就安装TDM-GCC








安装完TDM-GCC

在TDM-GCC安装目录下查找gendef.exe,我的路径是I:\TDM-GCC-64\x86_64-w64-mingw32\bin
然后我们启动一个cmd窗口

转到Fluent的库文件目录下,我的目录分别为:
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d_host
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d_node
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp_host
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp_node
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d_host
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d_node
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp_host
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp_node
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\win64\mpi\shared
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\win64\net\shared
我们以I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d为例:
将cmd窗口转到目录下

然后生成def文件


然后根据def生成GCC能识别的库


其余的目录根据上面的操作重复即可,注意一下
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d_node
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp_node
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d_node
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp_node
命令:
"I:\TDM-GCC-64\x86_64-w64-mingw32\bin\gendef.exe" fl_mpi1900.exe
生成def文件
命令:
dlltool --dllname fl_mpi1900.exe --def fl_mpi1900.def --output-lib fl_mpi1900.a
生成GCC的库
而
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\win64\mpi\shared
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\win64\net\shared
命令:
"I:\TDM-GCC-64\x86_64-w64-mingw32\bin\gendef.exe" mport.dll
生成def文件
命令:
dlltool --dllname mport.dll --def mport.def --output-lib mport.a
生成GCC的库
注意:以上步骤只需要第一次进行操作,以后再编译的时候就无需重复上面的步骤了,可直接使用这些已经生成的库
然后我们就可以编译UDF了(以二维双精度为例),但是UDF的写法必须按照下面的写法

Fluent相关的头文件:
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\main
I:\ Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\addon-wrapper
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\io
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\species
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\pbns
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\numerics
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\sphysics
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\storage
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mphase
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\bc
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\models
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\material
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\amg
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\util
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mesh
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\udf
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ht
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dx
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\turbulence
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\parallel
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\etc
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ue
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dpm
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dbns
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\cortex\src
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\client\src
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\tgrid\src
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\src
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\mpi_wrapper\src
注意:此处需要注意一下:请务必严格按照上面的头文件顺序!
示例是二维双精度的UDF,所以是
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp
如果是二维双精度并行UDF,那么就需要编译两次
对于host,那么就是
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp_host
对于node,那么就是
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp_node
如果是二维单精度就需要改变为:
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d
如果是二维单精度并行UDF,那么就需要编译两次
对于host,那么就是
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d_host
对于node,那么就是
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d_node
如果是三维双精度就需要改变为:
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp
如果是三维双精度并行UDF,那么就需要编译两次
对于host,那么就是
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp_host
对于node,那么就是
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp_node
如果是三维单精度就需要改变为:
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d
如果是三维单精度并行UDF,那么就需要编译两次
对于host,那么就是
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d_host
对于node,那么就是
I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d_node
在cmd窗口转入UDF源代码所在目录,我的是N:\demo_case

然后输入下面的命令

mkdir .\libudf\win64\2ddp && gcc -shared -o .\libudf\win64\2ddp\libudf.dll demo.c "I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp\fl1900.a" -I. -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\main" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\addon-wrapper" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\io" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\species" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\pbns" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\numerics" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\sphysics" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\storage" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mphase" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\bc" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\models" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\material" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\amg" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\util" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\util" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mesh" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\udf" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ht" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dx" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\turbulence" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\parallel" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\etc" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ue" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dpm" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dbns" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\cortex\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\client\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\tgrid\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\mpi_wrapper\src"
简单解释一下上面的命令:
mkdir .\libudf\win64\2ddp表示首先创建放置UDF生成文件的目录,否则后面直接编译的话,GCC不会自动生成目录从而造成编译出错
&&表示目录创建成功才能进行后面的命令
-o .\libudf\win64\2ddp\libudf.dll表示生成的UDF文件并且将其生成在前面生成的目录下
demo.c "I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp\fl1900.a"其中demo.c表示前面编写的UDF源代码,而后面这个是GCC需要连接的Fluent的库,我们这里是二维双精度,所以是
"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp\fl1900.a"
如果是二维单精度
"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d\fl1900.a"
如果是三维双精度
"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp\fl1900.a"
如果是三维单精度
"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d\fl1900.a"
编译完成

我们打开Fluent






当然我们也可以用C++的方式来编译,只需要将UDF按照如下的方式来改写即可,上面编译的命令gcc改为g++即可
接下来我们介绍如何使用gdb来调试UDF,原始的gdb是命令行来操作非常不方便

这里的gdb我们采用gdbgui,可以在浏览器中通过图形化界面的方式来对UDF程序进行调试
gdbgui下载地址:https://gdbgui.com/downloads.html
虽然gdbgui有打包好的exe包,但是这个包已经过时,无法用来调试UDF,所以我们采用python安装的方式安装最新的gdbgui
首先我们需要安装python,推荐anaconda,推荐从清华大学开源软件镜像站下载,下载链接:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
我使用的版本是Anaconda2-4.1.1,当然也可以按照自己的需要来下载安装,安装过程不清楚的话,可参考:https://blog.csdn.net/u012318074/article/details/77075209
然后打开cmd窗口,转入anaconda安装目录下的Scripts目录(我的是I:\Anaconda2\Scripts),如果不转到该目录下可能会安装出现问题

然后输入pip install gdbgui --upgrade命令

安装完成

我在用python3安装gdbgui的时候,maskupsafe可能会失败,只需要单独下载安装包本地安装即可,下载链接:
https://www.lfd.uci.edu/~gohlke/pythonlibs/,其他问题还可参考https://blog.csdn.net/candcplusplus/article/details/72793591
在cmd当中输入gdbgui test命令

表示安装成功
接下来我们介绍如何使用gdbgui来调试UDF
首先我们编写如下的UDF源码:

然后我们转入算例目录,在cmd下输入下面的命令:
mkdir .\libudf\win64\2ddp && gcc -O0 -g -shared -o .\libudf\win64\2ddp\libudf.dll demo.c "I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp\fl1900.a" -I. -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\main" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\addon-wrapper" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\io" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\species" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\pbns" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\numerics" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\sphysics" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\storage" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mphase" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\bc" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\models" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\material" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\amg" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\util" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\util" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mesh" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\udf" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ht" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dx" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\turbulence" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\parallel" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\etc" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ue" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dpm" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dbns" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\cortex\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\client\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\tgrid\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\mpi_wrapper\src"
注意:稍微解释一下上面这个命令的参数:
-O0表示不做任何优化,其实是默认选项,这里不写也可以,启用这个选项就是为了防止后面调试的错误。
-g 此参数是必须,用来产生供gdb调试用的可执行文件,否则无法用gdb进行调试。
我们启动Fluent



然后再返回cmd当中输入gdbgui


打开任务管理器



我们也可以在Fluent当中使用TUI命令来查看PID号

回到gdbgui打开的浏览器页面






我们返回Fluent当中

然后我们又回到浏览器的gdbgui页面


GCC编译UDF和gdb调试UDF的更多相关文章
- Linux下编译ffmpeg并用GDB调试
1.在Ubuntu界面上调处命令行界面,最方便的方式是使用快捷键Ctrl+Alt+T. 2.安装SDL SDL是一个开源的多媒体开发库,可以设置图像和视频的绘制等操作.如果不安装SDL,FFMPEG将 ...
- 8. VIM 系列 - 利用 VIM 8.1 版本编译项目和GDB调试
目录 term 模式 termdebug 模式 VIM版本安装请参考: 0. VIM 系列 - 源码升级最新版本vim term 模式 输入:term 打开此模式,效果如下 这个模式有编辑文本窗口和s ...
- Sublime Text:Windows下配置C 编译环境和GDB调试环境
写此文解决两个问题: 1.在Sublime Text中实现编译运行含有外部输入的C程序(如含有scanf的程序); 2.在程序运行完毕后不退出cmd,能继续用gdb调试程序. 一.MinGW 下载地址 ...
- GCC 编译详解
GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Jav ...
- GCC 编译详解[转]
转自http://www.cnblogs.com/azraelly/archive/2012/07/07/2580839.html GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译 ...
- gcc编译问题
gcc avl.o hash.o list.o rb.o example.o -o 123.exe 多个.o输出 exe -c和-o都是gcc编译器的可选参数.-c表示只编译(compile)源文件但 ...
- GCC 编译详解 (转)
GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Jav ...
- gdb 调试 报 stepping until--- has no line number information
gdb 经常用 ,但今天使用gdb 调试的时候, break 打断点, 结果也没有打出 哪一行的信息,就只是提示一个具体地址. 使用单步调试 结果爆出 stepping until exit from ...
- 一文入门Linux下gdb调试(一)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 在window下我们习惯了IDE的各种调试按钮,说实话确实挺方便的,但到了Linux下,没有那么多的IDE ...
随机推荐
- 版本控制器:Git-的使用
版本控制器:Git # 达到多人协同开发的目的 安装 """ 1.下载对应版本:https://git-scm.com/download 2.安装git:在选取安装路径的 ...
- 换个语言学一下 Golang (13)——Web表单处理
介绍 表单是我们平常编写Web应用常用的工具,通过表单我们可以方便的让客户端和服务器进 行数据的交互.对于以前开发过Web的用户来说表单都非常熟悉.表单是一个包含表单元素的区域.表单元素是允许用户在表 ...
- Java小知识点总结01
1. 整数相乘或者相加,如果超过最大整数值,会变成负数 2. 字符串比较可以使用:s1.compareTo(s2) ,如果s1大于s2返回值大于1,等于返回值等于0,小于返回值小于1 3. char值 ...
- 【案例】如何让阀门制造提高排产效率?APS系统帮你实现
随着公司业务发展,苏州纽威阀门公司将承接来自各个国家的更多产品业务,越来越多的客户要求对产品进行精确的交期预估和管理.而目前对产线的产能管理仅限于人工静态产能计算. 由于产品繁多,生产流程各异,不同产 ...
- 微信小程序获取用户手机号 记录 (PHP)
1. 用户登录时需要获取 openid ,同时可以获取 session_key, 二者同时返回, 此时我们要将二者存储在服务端. 2. 小程序端 button 按钮拉起授权, 向api 传递 iv 和 ...
- 解决Android studio导航tools下没有android怎么打开DDMS工具
因为这个功能用的人少, 新版本就去掉菜单入口了, 但这个功能并没有删除,打开方式:点开terminal ,也就是AS自带的命令行工具, 输入monitor 回车就启动了, 1.点开terminal 2 ...
- 【使用DIV+CSS重写网站首页案例】CSS浮动
CSS浮动: 浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边缘为止 由于浮动框不在文件的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样. 选择器之 float属性 ...
- 算法——dfs 判断是否为BST
95. 验证二叉查找树 中文English 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值 ...
- P4281 [AHOI2008]紧急集合 / 聚会[LCA]
解析 蒟蒻用的办法比较蠢,不如上面的各位大佬,直接化成一个式子了,我还是分类讨论做的. 下面正文. 猜想:最优集合点一定是三点任意两对点对应的路径的交点. 不妨这样想,如果任意两个人经过同一条路径,那 ...
- nginx部署vue项目
nginx是一个高性能的HTTP和反向代理服务器.因此常用来做静态资源服务器和后端的反向代理服务器.本文主要记录使用nginx去部署使用vue搭建的前端项目,项目基于vue官方的脚手架vue-cli构 ...