Fluent UDF 第七章 UDF的编译与链接
64位 ANSYS FLUENT 编译UDF方法

ANSYS FLUENT 12.x 13.x版下使用Visual Studio 2010编译UDF的设置方法COMSOL出了点问题,只能重装系统搞定。
神马软件都要重装啊,今天装好ANSYS后,打开FLUENT界面时,灵感闪现,想出下面的方法设置UDF编译环境。
其实ANSYS版的FLUENT用UDF是不需要到系统环境变量里面设置path,include,lib的,如果您用的是Visual Studio 2010及后续版本,只需要按一定的规则设置udf.bat文件就行了。
从udf.bat文件结构看,VS版本在VS2010以前的都可以不用设置,即可使用。
实现方法,以Win7 X64位ANSYS X64位为例:1.找到fluent安装目录下的udf.bat(C:\Program Files\ANSYS Inc\v121\fluent\ntbin\win64\udf.bat)用文本编辑器修改udf.bat:添加echo trying to find MS C compiler, version 10.0....set MSVC_DEFAULT=%ProgramFiles(x86)%\Microsoft Visual Studio 10.0if exist "%MSVC_DEFAULT%\vC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT%if not "%MSVC%" == "" goto msvc_env100set MSVC_DEFAULT=%ProgramFiles%\Microsoft Visual Studio 10.0if exist "%MSVC_DEFAULT%\vC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT%if not "%MSVC%" == "" goto msvc_env100:msvc_env100set MSVC_VERSION=100call "%MSVC%\VC\vcvarsall.bat" amd64goto ms_c_end注:如果Visual Studio安装到其他盘,(可能)需要修改路径,比如装到D盘Program Files下,便这样添加:set MSVC_DEFAULT=d:\Program Files\Microsoft Visual Studio 10.0if exist "%MSVC_DEFAULT%\vC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT%if not "%MSVC%" == "" goto msvc_env100:msvc_env100set MSVC_VERSION=100call "%MSVC%\VC\vcvarsall.bat" amd64goto ms_c_end2. 保存该文件即可实现编译环境设置3. 打开FLUENT,确认勾选UDF compiler下的setup compilation environment for UDF:4. 编译成功附:环境变量设置方法:include中添加:64位系统:%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\include;%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\Include;32位系统:%ProgramFiles%\Microsoft Visual Studio 10.0\VC\include;%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\Include;path 中添加:64位系统:%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\lib;%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\lib32位系统:%ProgramFiles%\Microsoft Visual Studio 10.0\VC\lib;%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\liblib中添加:64位系统:%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\bin;%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\bin\amd64;%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE;%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\Tools;32位系统:%ProgramFiles%\Microsoft Visual Studio 10.0\VC\bin;%ProgramFiles%\Microsoft Visual Studio10.0\VC\bin\amd64;%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE;%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\Tools;天乐树2011.10.20。
2024版年度FluentUDF教程详细全面适合初学者

初学者CONTENTS •FluentUDF简介与背景•编程环境与工具准备•UDF基础知识讲解•Fluent中UDF应用实践•性能优化与调试技巧•拓展应用与前沿进展FluentUDF 简介与背景01FluentUDF(User-Defined Function)是用户自定义函数,允许用户扩展和定制Fluent软件的功能。
FluentUDF可以用于定义边界条件、材料属性、源项、输运方程等,以满足特定问题的需求。
通过FluentUDF,用户可以将自己的数学模型和算法集成到Fluent中,实现更高级别的模拟和分析。
010203 FluentUDF定义及作用Fluent计算流体力学基础Fluent是一款基于有限体积法的计算流体力学软件,用于模拟和分析流体流动、传热、化学反应等物理现象。
Fluent提供了丰富的物理模型、数值方法和求解器,可应用于多种领域,如航空、汽车、能源、生物等。
Fluent的计算流程包括前处理、求解和后处理三个阶段,其中前处理用于建立几何模型、划分网格和设置边界条件,求解用于进行数值计算,后处理用于结果可视化和数据分析。
UDF可以扩展Fluent的标准功能,使其能够处理更复杂的物理现象和数学模型。
UDF可以提高模拟的准确性和精度,通过自定义边界条件、源项等,更好地描述实际问题的特性。
UDF还可以加速模拟过程,通过优化算法和并行计算等技术,提高计算效率。
UDF在Fluent中重要性学习FluentUDF可以深入理解Fluent软件的内部机制和计算原理,有助于更好地掌握该软件。
通过学习FluentUDF,可以培养编程思维和解决问题的能力,为未来的科学研究和工程实践打下基础。
FluentUDF是Fluent的高级功能之一,掌握它可以提高求职竞争力,拓宽职业发展道路。
FluentUDF具有很强的实用性和通用性,掌握它可以为解决实际工程问题提供有力工具。
9字9字9字9字初学者为何选择学习FluentUDF编程环境与工具准备02Fluent软件安装与配置要求操作系统兼容性确保操作系统与Fluent软件版本兼容,如Windows、Linux等。
fluent组分输运分压力的udf

fluent组分输运分压力的udfFLUENT是一种流体力学计算软件,其提供了一些内置的函数和工具来模拟流体输运过程。
然而,有时候我们需要进一步扩展FLUENT的功能,来解决一些特殊的问题。
在这种情况下,我们可以使用用户自定义函数(User Defined Function,简称UDF)来实现。
UDF是一种用于FLUENT软件的自定义代码,它可以被集成到FLUENT求解器中,并通过FLUENT的编译和链接工具编译成动态链接库。
以此方式,UDF可以被FLUENT加载和调用,从而扩展软件的功能。
在该问题中,我们需要编写一个UDF来模拟流体输运过程中的分压力情况。
下面是该UDF的基本结构和实现步骤:1.引入所需的FLUENT头文件和标准C库文件:```#include "udf.h"#include "math.h"2.实现UDF主函数`DEFINE_SOURCE`:```DEFINE_SOURCE(pressure_source, cell, thread, dS, eqn) {real pressure;real x[ND_ND];real k = 1.0; //分压力系数C_CENTROID(x, cell, thread);//根据坐标计算分压力pressure = k * (x[0] + x[1] + x[2]);//将分压力加载到方程的源项中eqn->source[dS] = pressure;return 0;```3.编译UDF:使用FLUENT提供的编译和链接工具,将UDF编译成动态链接库。
可以按照FLUENT的官方文档或在线教程中的指导进行操作。
4.在FLUENT中加载UDF:在FLUENT中,选择"Define" -> "User-Defined" -> "Functions",在UDF Manager中加载编译好的UDF动态链接库文件。
FLUENT入门07UDF

简介
什么是UDF?
– UDF 是用户自己用C语言写的一个函数,可以和FLUENT动态链接
• 标准C 函数
▪ 三角函数,指数,控制块,Do循环,文件读入/输出等
• 预定义宏
▪ 允许获得流场变量,材料属性,单元几何信息及其他
为什么使用 UDFs?
– 标准的界面不能编程模拟所有需求:
• 定制边界条件,源项,反应速率,材料属性等 • 定制物理模型 • 用户提供的模型方程 • 调整函数 • 执行和需求函数 • 初始化
Header file “udf.h” must be included at the top of the program by the #include command
#include "udf.h" DEFINE_PROFILE(x_velocity,thread,nv) { float x[3]; /* an array for the coordinates */ float y; face_t f; /* f is a face thread index */
可以在运行窗口中改变速度分布的更新间隔(默认为1)
– 这个设置控制了流场多久(迭代或时间步)更新一次
udf编译

udf编译UDF编译什么是UDF?UDF(User Defined Function)即用户自定义函数,是一种用户可以自行编写并添加到数据库中的函数。
它可以扩展数据库的功能,使得用户可以使用自己定义的函数来完成一些特定的操作。
UDF编译过程在MySQL中,UDF是通过动态链接库(DLL)实现的。
因此,要使用UDF,必须先将其编译成动态链接库。
1. 编写UDF源代码首先需要编写一个C/C++源文件来实现自己想要实现的功能。
这个源文件需要包含以下内容:- 头文件:包含必要的头文件,如mysql.h、stdio.h等。
- 函数声明:声明需要实现的函数。
- 函数定义:实现需要实现的函数。
例如,下面是一个简单的UDF源代码示例:```#include <stdio.h>#include <mysql.h>my_bool hello_init(UDF_INIT *initid, UDF_ARGS *args, char *message);void hello_deinit(UDF_INIT *initid);char* hello(UDF_INIT *initid, UDF_ARGS *args, char* result, unsigned long* length, char* is_null, char* error);my_bool hello_init(UDF_INIT *initid, UDF_ARGS *args, char *message){return 0;}void hello_deinit(UDF_INIT *initid){return;}char* hello(UDF_INIT *initid, UDF_ARGS *args, char* result, unsigned long* length, char* is_null, char* error){sprintf(result, "Hello, %s!", args->args[0]);*length = strlen(result);return result;}```这个UDF实现的功能是将输入的字符串加上“Hello, ”前缀输出。
Fluent中的UDF详细中文教程(7)

第七章 UDF的编译与链接编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。
在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。
_ 第 7.1 节: 介绍_ 第 7.2 节: 解释 UDF_ 第 7.3 节: 编译 UDF7.1 介绍解释的UDF和编译的UDF其源码产生途径及编译过程产生的结果代码是不同的。
编译后的UDF由C语言系统的编译器编译成本地目标码。
这一过程须在FLUENT运行前完成。
在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。
另一方面,解释的UDF被编译成与体系结构无关的中间代码或伪码。
这一代码调用时是在内部模拟器或解释器上运行。
与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。
如果执行速度是所关心的,UDF文件可以不用修改直接在编译模式里运行。
为了区别这种不同,在FLUENT中解释UDF和编译UDF的控制面板其形式是不同的。
解释UDF的控制面板里有个“Compile按钮”,当点击“Compile按钮”时会实时编译源码。
编译UDF的控制面板里有个“Open 按钮”,当点击“Open按钮” 时会“打开”或连接目标代码库运行FLUENT(此时在运行FLUENT之前需要编译好目标码)。
当FLUENT程序运行中链接一个已编译好的UDF库时,和该共享库相关的东西都被存放到case文件中。
因此,只要读取case文件,这个库会自动地链接到FLUENT处理过程。
同样地,一个已经经过解释的UDF文件在运行时刻被编译,用户自定义的C函数的名称与内容将会被存放到用户的case文件中。
只要读取这个case文件,这些函数会被自动编译。
注:已编译的UDF所用到的目标代码库必须适用于当前所使用的计算机体系结构、操作系统以及FLUENT软件的可执行版本。
一旦用户的FLUENT升级、操作系统改变了或者运行在不同的类型的计算机,必须重新编译这些库。
fluent之UDF文件的操作

fluent之UDF⽂件的操作
下⽂转⾃沙场醉客之博客:
可⽤txt⽂件进⾏UDF编程,之后将⽂件改为.c⽂件。
(也可⽤VC编程,保存为.c⽂件)
将程序导⼊到Fluent中利⽤编译功能,具体操作
在 fluent中的Define -> Use-Defined -> Compiled 打开之后,选择source files下⾯的Add...,找到编写好的.c⽂件打开,点击Build,就会⽣成⼀个以liberary name命名的⽂件夹,编译好的资料就放在这个⽂件夹⾥⾯,最后点击load就会将编译好的内容导⼊到Fluent中,这样你在有UDF选项的下拉菜单中就会看到你编好的程序名称。
利⽤UDF编程和C语⾔编程很相似,所以最好知道⼀些C语⾔编程的基础,再掌握⼀些Fluent的UDF固有的⼀些命令,基本上⼀些简单的程序就都没问题了。
Fluent中的UDF详细中文教程(8)

第八章 在FLUENT中激活你的UDF一旦你已经编译(并连接)了你的UDF,如第7章所述,你已经为在你的FLUENT模型中使用它做好了准备。
根据你所使用的UDF,遵照以下各节中的指导。
z8.1节激活通用求解器UDFz8.2节激活模型明确UDFz8.3节激活多相UDFz8.4节激活DPM UDF8.1 激活通用求解器UDF本节包括激活使用4.2节中宏的UDF的方法。
8.1.1 已计算值的调整一旦你已经使用7.2节和7.3节中概括的方法之一编译(并连接)了调整已计算值UDF,这一UDF在FLUENT中将成为可见的和可选择的。
你将需要在User-Defined Function Hooks面板的Adjust Function下拉菜单(图8.1.1)中选择它。
调整函数(以DEFINE_ADJUST宏定义)在速度、压力及其它数量求解开始之前的一次迭代开始的时候调用。
例如,它可以用于在一个区域内积分一个标量值,并根据这一结果调整边界条件。
有关DEFINE_ADJUST宏的更多内容将4.2.1节。
调整函数在什么地方适合求解器求解过程方面的信息见3.3节。
8.1.2 求解初始化一旦你已经使用7.2节和7.3节中概括的方法之一编译(并连接)了求解初始化UDF,这一UDF在FLUENT中将成为可见的和可选择的。
你将需要在User-Defined Function Hooks面板的Initialization Function下拉菜单(图8.1.1)中选择它。
求解初始化UDF使用DEFINE_INIT宏定义。
细节见4.2.2节。
8.1.3 用命令执行UDF一旦你已经使用7.2节和7.3节中概括的方法之一编译(并连接)了你的UDF,你可以在Execute UDF On Demand面板中选择它(图8.1.2),以在某个特定的时间执行这个UDF,而不是让FLUENT在整个计算中执行它。
点击Execute按纽让FLUENT立即执行它。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章 UDF的编译与链接编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。
在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。
_ 第 7.1 节: 介绍_ 第 7.2 节: 解释 UDF_ 第 7.3 节: 编译 UDF7.1 介绍解释的UDF和编译的UDF其源码产生途径及编译过程产生的结果代码是不同的。
编译后的UDF由C语言系统的编译器编译成本地目标码。
这一过程须在FLUENT运行前完成。
在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。
另一方面,解释的UDF被编译成与体系结构无关的中间代码或伪码。
这一代码调用时是在内部模拟器或解释器上运行。
与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。
如果执行速度是所关心的,UDF文件可以不用修改直接在编译模式里运行。
为了区别这种不同,在FLUENT中解释UDF和编译UDF的控制面板其形式是不同的。
解释UDF的控制面板里有个“Compile按钮”,当点击“Compile按钮”时会实时编译源码。
编译UDF的控制面板里有个“Open按钮”,当点击“Open按钮” 时会“打开”或连接目标代码库运行FLUENT(此时在运行FLUENT之前需要编译好目标码)。
当FLUENT程序运行中链接一个已编译好的UDF库时,和该共享库相关的东西都被存放到case文件中。
因此,只要读取case文件,这个库会自动地链接到FLUENT处理过程。
同样地,一个已经经过解释的UDF文件在运行时刻被编译,用户自定义的C函数的名称与内容将会被存放到用户的case文件中。
只要读取这个case文件,这些函数会被自动编译。
注:已编译的UDF所用到的目标代码库必须适用于当前所使用的计算机体系结构、操作系统以及FLUENT软件的可执行版本。
一旦用户的FLUENT升级、操作系统改变了或者运行在不同的类型的计算机,必须重新编译这些库。
UDF必须用DEFINE宏进行定义,DEFINE宏的定义是在udf.h文件中。
因此,在用户编译UDF之前,udf.h文件必须被放到一个可被找到的路径,或者放到当前的工作目录中。
udf.h文件放置在:path/Fluent.Inc/fluent6.+x/src/udf.h其中path是Fluent软件的安装目录,即Fluent.Inc目录。
X代表了你所安装的版本号。
通常情况下,用户不应该从安装默认目录中复制udf.h文件。
编译器先在当前目录中寻找该文件,如果没找到,编译器会自动到/src目录下寻找。
如果你升级了软件的版本,但是没有从你的工作目录中删除旧版本的udf.h文件,你则不能访问到该文件的最新版本。
在任何情况下都不应该改变udf.h文件。
7.2 UDF解释这一节介绍编译经过解释的UDF的步骤。
一旦经过解释的UDF被编译,用户自定义的C函数的名称与内容将会被存放到case文件中。
只要读取这个case文件,这些函数便会自动被编译。
编译被解释的UDF的一般程序如下:1. 如果用户没有在网络Windows计算机上使用并行的FLUENT版本,则需要确定UDF的C源码和case文件与当前工作目录一致。
具体步骤见7.2.2节。
! 如果源码不在当前工作目录,则用户编译UDF时,用户必须在解释UDF的控制面板里输入文件的完全路径,而不是只输入文件名。
2. 在当前工作目录下运行FLUENT。
3. 读取(或建立)case文件。
4. 打开“Interpreted UDFs panel”,编译UDF(如vprofile.c)。
图7.2.1 解释的UDF的控制面板(a) 在“Source File Name”下输入C源码的文件名(如vprofile.c)。
! 如果自定义的C源码不在工作目录中,用户必须输入完全的自定义的C函数路径。
当写入case文件时,自定义源码的名称(或源码的完全路径)会存放到case文件中。
(b) 在“CPP Command Name”指定为C的预处理程序。
当然也有其它有效的ANSI C预处理程序,包括gcc -E和cc –E。
详细检查所用的计算机系统管理。
(c) 如果自定义函数局部变量数不引起栈的溢出,则保持“Stack Size”的默认值为1000。
此时,所设 “Stack Size” 的数要远远大于局部变量用的数。
(d) 选择“Display Assembly Listing”,则当函数编译汇编码的清单会出现在窗口的控制台内。
这一选项会保存于case文件,当用户接着运行FLUENT时汇编码会自动显示。
(e) 如果用户使用“Fluent Inc”提供的C预处理程序,选择“Use Contributed CPP”。
(f) 点击“Compile”编译UDF。
自定义C程序的名称和内容会存入于所写的case文件。
只要编译UDF,汇编码会出现在控制窗口,所示范例如下。
(g) 编译结束点击“Close”。
! 如果在一次模拟中使用多于一个的UDF,用户需要将这些函数连接在一个C文件中,例如all.c。
然后用“Interpreted UDFs”面板编译连接的文件。
这些函数可以作为边界条件、源项及特性等。
7.2.2 基于Windows并行网络的目录结构在基于Windows网络上使用并行FLUENT版本需要专门的方法组织用户文件。
具体步骤如下:1. 在“Fluent.Inc”目录下创建一个名为“udf” 的可写子目录。
2. 在udf目录下创建子目录(如Fluent.Inc\udf\myudf),将UDF的C源码存放于这个目录下。
如果在同一串下多个用户运行工作,每个用户在udf目录下创建自己的子目录(如Fluent.Inc\udf\abcudf和xyzudf)。
! 因为源码不在当前工作目录下,所以在编译UDF时必须在“Interpreted UDFs”面板中输入文件的完全路径。
例如,编译example.c文件时,输入如下: \\<fileserver>\Fluent.Inc\udf\myudf\example.c<fileserver>应输入用户所安装FLUENT的计算机名(如myserver)。
3. 确定所建立的case文件在当前工作目录下。
7.2.3 调试解释的UDF编译UDF时出错信息会出现在控制窗口中。
用户有可能因错误滚动太快不能看到所用的出错信息。
因此调试UDF时用户想关掉“Display Assembly Listing”。
如果在调试UDF的过程中一直打开“Interpreted UDFs”面板,由于在独立窗口进行编辑,编译按钮则会不断重复编译。
然后,直到无出错信息调试和编译才会结束。
下面介绍一个出错例子,即在“Interpreted UDFs”控制面板中,编译被解释过的UDF时指定了错误的源文件。
上面曾介绍过如果仅仅从当前工作目录下启动FLUENT,在“Interpreted UDFs”控制面板中键入用户的C源码的文件名,则case 文件和C源码被指定于当前工作目录下。
如果用户编译的C源码与工作目录是不同的路径,用户必须输入C源码所在的完整路径。
否则会出现以下的错误信息: gcc: vprofile.c: No such file or directorygcc: No input filesError: vprofile.c: line 1: syntax error.如果编译UDF写完case文件后,接着移动C源码到不同位置,会在接着运行FLUENT 的过程中产生同样的错误信息。
为了避免错误,只需要在“Interpreted UDFs”控制面板中的“Source File Name”下输入完全的路径名,然后点击“Compile”。
此时写case文件会保存C源码的新路径。
7.3 编译UDF这一节介绍如何链接编译好的UDF。
这一过程需要使用C编译器。
大部分UNIX的操作系统提供了C编译器。
如果在PC机上运行,需要安装VC++编译器(如微软C++、v6.0或更高的版本)。
一旦编译好的UDF库文件在FLUENT运行时链接到FLUENT处理过程,和共享库相关的东西会保存到case文件。
因此,只要读取case文件,编译的库文件会自动链接到FLUENT处理过程。
在控制窗口将会出现链接状态的报告如下:Opening library "libp1/ultra/2d/libudf.so"...p1_adjustenergy_sourcep1_sourcep1_diffusivityp1_bcDone.7.3.1 一般程序编译和链接一个编译好的UDF的一般程序如下所示:1. 在当前工作目录下,建立专门的目录结构(见7.3.2节)。
2. 编译用户的UDF和修建共享库(见7.3.3节)。
3. 在当前工作目录下运行FLUENT。
4. 读取(或建立)case文件(确信case文件在当前工作目录下)。
5. 链接共享库到FLUENT(见7.3.4节)。
7.3.2 建立目录结构对于UNIX系统和Windows系统来说,目录结构是不同的。
下面分别介绍在两种系统下如何建立目录结构。
UNIX系统对于UNIX系统下编译的UDF来说,makefile.udf和makefile.udf2两个文件在编译UDF库被需要。
makefile文件包含了用户自定义部分,在这部分允许输入用户源函数和FLUENT的安装路径。
这些文件的完整路径如下:path/Fluent.Inc/fluent6.+x/src/makefile.udfpath/Fluent.Inc/fluent6.+x/src/makefile.udf2其中path是用户直接安装Fluent.Inc的路径,x是用户安装Fluent版本的相应数(如,fluent6.0为0)。
! FLUENT安装后所释放的makefile.udf2文件名为Makefile.udf。
下面介绍建立共享库所要求的目录结构。
通过下面的例子来介绍目录结构的建立,如图7.3.1所示。
图7.3.1 为编译好的UDF建立库目录的样本(UNIX)需要注意的是在图7.3.1所示的目录结构为FLUENT的两种版本:二维单精度串型和二维单精度平行。
!不要在目录(2d,2d host,等等)下存放任何文件。
当编译用户库(见7.3.3节)时,图7.3.1中所示的文件会自动存放。
1. 在当然工作目录下,创建一个储存用户库的目录(如libudf)。
2. 从以上所示目录下复制makefile.udf2到用户目录(如libudf),且改名为Makefile。
3. 在用户创建的库目录下,建立一个储存用户源码、命名为src的源码目录。