基于VsCode、Vs(MinGW)和cmake的UDF编译平台搭建

一、编译环境的配置

  1. 搭建vsCode+CMake开发环境 (vsCode+CMake开发环境搭建_vscode cmake_TomKing-tm的博客)

  2. 安装编译器MinGW,并在系统环境变量中添加环境变量(下载安装MinGW-w64详细步骤(c/c++的编译器gcc的windows版,win10真实可用)) MinGW_HOME = "D:\MinGW\mingw64" path中加入 %MinGW_HOME%\bin
    注: ——也可以选择安装visual Studio

  3. 安装Cmake软件(CMake 常用方法-CSDN博客)

  4. 安装vscode插件C/C++、CMake、CMake Tools。(插件可以官网离线下载ms-vscode.cpptools-1.17.5@win32-x64.vsix、ms-vscode.cmake-tools-1.16.11.vsix、twxs.cmake-0.0.17.vsix) Alt text

  5. 打开vscode的terminal,验证gcc和cmake是否配置完成。

gcc --version
cmake --version

Alt text

二、代码编译前的准备工作

  1. 借助网络上用cmake配置udf编译文件,相应的源代码下载地址

  2. 新建文件夹libudf或者libxxx(其中xxx为任意其他字符组合)

  3. 解压udf-master.zip到当前编译目录,并重命名为src

libudf
            |
             ——src
                |
                 ——your_udf.c  
                 ——CMakeLists.txt
                |
                 ——surpport
                    |
                     ——host
                     ——node
                     ——pre_chore.cmd 等
  1. 其中,主要替换文件中udf源代码,以及修改src下的CMakeLists.txt

#SETTINGS
        ############################
        set(CSOURCES test.c)   #only one#改为你的udf.c名称
        set(CHEADERS)           #only one#
        set(DIM 3d)             #3D 这里默认为3ddp,若想编译成3d,则需要在host和node的CMakeLists.txt(surpport文件夹中)删除dp
        SET(RELEASE 18.2.0)     #22.2.0=Fluent 2022R2   可根据自己安装版本修改,可以参考Makefile文件设置
        SET(FLUENT_ARCH win64)  #Windows 64bit          
        set(LIB_RELEASE 1820)   #2220=Fluent 2022R2     可根据自己安装版本修改,可以参考Makefile文件设置
        #############################



        cmake_minimum_required(VERSION 3.19)
        project(udf)                    #工程名称,可以不修改采用默认
        set(PARALLEL_NODE intel)        #设置并行方法,一般默认intel
        # set(FLUENT_INC "d:\program files\ansys182\ansys inc\v182\fluent")  #此代码原文件中没有,可以在环境变量中添加
  1. 源代码同时编译host和node,因此host和node的CMakeLists.txt文件中libudf1和libudf区分

    ADD_LIBRARY(libudf1 SHARED ./../../${CSOURCES} ./../../${CHEADERS} ./../udf_names.c)      
        set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION})
        TARGET_LINK_LIBRARIES(libudf1 ${FLUENT_LIB})
  1. 生成的文件在3ddp_host和3ddp_node文件夹中分别以libudf.*和libudf1.*命名,源代码通过在libudf1.*对应的源文件CMakeLists.txt中添加下述代码

    add_custom_command(TARGET libudf1
		POST_BUILD
		COMMAND ${CMAKE_COMMAND} -E rename ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION}/libudf1.dll ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION}/libudf.dll    #重命名libudf1.dll为libudf.dll
		)

三、 代码cmake配置及编译

  1. vscode打开文件夹,选择上述创建的libudf文件夹

  2. 一般界面会出现下树代码,选择第一个,如果没出现则可以通过ctrl+shift+P ,输入CMake: configure来设置;选择后在libudf文件下出现一个build文件夹

        ${workspaceFolder}/src/CMakeLists.txt
        ${workspaceFolder}/src/surpport/host/CMakeLists.txt
        ${workspaceFolder}/src/surpport/node/CMakeLists.txt

Alt text 3. 可以修改最下方状态栏的CMake:[Release]/debug等;以及编译工具(本教程前期所装的gcc,编译总是出问题,因此选择的visualSudio.12.0-x86_amd64);生成 Alt text 4. 选择Build既可以编译完成 5. 由于使用了vs编译工具,会在host/release/和node/release/下生成文件,因此对相应的CMakeLists.txt做下述修改,原理为复制文件到上一级目录,然后删除release文件夹,并对libudf1.dll文件重命名

        #host
        add_custom_command(TARGET libudf1
		POST_BUILD
		COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION}/$(Configuration) ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION}/
		COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION}/$(Configuration) 
		COMMAND ${CMAKE_COMMAND} -E rename ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION}/libudf1.dll ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION}/libudf.dll 
		)
        #node 
        add_custom_command(TARGET libudf
		POST_BUILD
		COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION}/$(Configuration) ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION}/
		COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_SOURCE_DIR}/../${FLUENT_ARCH}/${VERSION}/$(Configuration) 
		)
  1. 打开fluent加载udf

  2. 若要调试udf,一方面加载udf,另一方面vs2013打开build文件夹下的udf.sln工程,打开test.c源代码,点击调试下的附加到进程,查看fluent的相应节点的进程pid(可在fluent里查看,如下所示;目前:一般只能附加到一个进程上) Alt text

注:

  1. 初始编译会出现一个报错,为sys_master.h(D:\Program Files\ansys182\ANSYS Inc\v182\fluent\fluent18.2.0\client\src\sys_master.h)中cbrt重定义,只需要把相应代码(在1469行)注释掉即可,此代码针对vs2012版本以前的提供,vs2012以后版本提供,不需要定义。

        /* cube-root for systems that don't have it */
        /* Visual Studio 2012 onwards has cbrt, so define for earlier versions only. */
        /#ifndef __PGI
        #if _MSC_VER < 1700
        #define cbrt(_x) pow(_x, 1.0/3.0)
        #else
        extern double cbrt(double);
        extern float  cbrtf(float);
        #endif
        #endif 
  1. vs编译工具需要选在X86_amd64

  2. 对于高版本的头文件库可能有增加,需要查看响应版本的makefile文件,做一定的修改;

    include_directories(
		${PROJECT_SOURCE_DIR}/support
		${FLUENT_INC}\\fluent${RELEASE}\\${FLUENT_ARCH}\\${VERSION}
		${FLUENT_INC}\\fluent${RELEASE}\\src\\main
		${FLUENT_INC}\\fluent${RELEASE}\\src\\addon-wrapper
		${FLUENT_INC}\\fluent${RELEASE}\\src\\io
		${FLUENT_INC}\\fluent${RELEASE}\\src\\species
		${FLUENT_INC}\\fluent${RELEASE}\\src\\pbns
		${FLUENT_INC}\\fluent${RELEASE}\\src\\numerics
		${FLUENT_INC}\\fluent${RELEASE}\\src\\sphysics
		${FLUENT_INC}\\fluent${RELEASE}\\src\\storage
		${FLUENT_INC}\\fluent${RELEASE}\\src\\mphase
		${FLUENT_INC}\\fluent${RELEASE}\\src\\bc
		${FLUENT_INC}\\fluent${RELEASE}\\src\\models
		${FLUENT_INC}\\fluent${RELEASE}\\src\\material
		${FLUENT_INC}\\fluent${RELEASE}\\src\\amg
		${FLUENT_INC}\\fluent${RELEASE}\\src\\util
		${FLUENT_INC}\\fluent${RELEASE}\\src\\mesh
		${FLUENT_INC}\\fluent${RELEASE}\\src\\udf
		${FLUENT_INC}\\fluent${RELEASE}\\src\\ht
		${FLUENT_INC}\\fluent${RELEASE}\\src\\dx
		${FLUENT_INC}\\fluent${RELEASE}\\src\\turbulence
		${FLUENT_INC}\\fluent${RELEASE}\\src\\acoustics
		${FLUENT_INC}\\fluent${RELEASE}\\src\\parallel
		${FLUENT_INC}\\fluent${RELEASE}\\src\\etc
		${FLUENT_INC}\\fluent${RELEASE}\\src\\ue
		${FLUENT_INC}\\fluent${RELEASE}\\src\\dpm
		${FLUENT_INC}\\fluent${RELEASE}\\src\\dbns
		${FLUENT_INC}\\fluent${RELEASE}\\cortex\\src
		${FLUENT_INC}\\fluent${RELEASE}\\client\\src
		${FLUENT_INC}\\fluent${RELEASE}\\tgrid\\src
		${FLUENT_INC}\\fluent${RELEASE}\\multiport\\src
		${FLUENT_INC}\\fluent${RELEASE}\\multiport\\mpi_wrapper\\src
		${FLUENT_INC}\\include)

本文章使用limfx的vscode插件快速发布