1、科学技术创新 2023.26Fortran Powerstatio 4.0 静态链接库建立与使用陈彦瑾(河海大学 水利水电学院,江苏 南京)前言Fortran 语言是世界上最早出现的计算机高级编程语言,在科学和工程计算领域相比其他编程语言更具优势。即使在计算机语言发展到今天的多元时代,Fortran 语言仍在广泛使用1-2。因此,完善其使用方法或功能,还是有一定意义的。王柯等1基于 Fortran 语言,分析了粮堆温度、水分含量、储粮害虫增长量以及杀虫剂浓度衰减的变化。杨成坤等2研发地下及井中探测软件平台,其中很多模块由 Fortran 语言编写。齐云飞、胡凡3基于 Fortran与 VB 混
2、合编程建立了水库群联合优化调度系统。很多高校至今仍将 Fortran 语言列为本科生教学主干课程4。使用静态链接库对部分程序进行封装是常用的手段之一,使用很广泛。本文主要介绍在 FortranPowerStation 4.0 环境下建立静态链接库,利用主程序调用静态库的方法,并结合示例程序介绍该方法的使用。1Fortran 静态链接库建立方法1.1建立静态链接库项目工作空间首次建立静态链接库项目工作空间时,需要在FortranPowerstation4.0 环 境 下 打 开 MicrosoftDeveloper Studio,执行 File-New 命令,在弹出的新建(New)窗口中选择项目
3、工作空间(Project Workspace),如图 1 所示,点击 OK 后在 New Project Workspace 对话框中选择项目类型(Type)为 Static Library(静态链接库),输入项目文件名称如 Sub,软件默认的文件存储位 置 为“C:MSDEVProjects”,点 击 Creat 后 会 在Projects 目录(即文件夹,以下所谓“目录”均指文件夹)下生成名为 Sub 的项目文件夹,Sub 目录内生成 Sub.mak 文件。这时,静态链接库的项目工作空间已经建摘要:静态链接库可以封装已经成熟的程序代码,优化程序结构。Fortran 静态链接库的建立和使用并
4、不复杂,大型程序经简单改写便可使用静态库进行封装,这无疑会带来很大的方便。本文介绍了一种在 FortranPowerstatio 4.0 环境下建立静态链接库,并通过主程序调用链接库的简单实用的方法。静态链接库在工程计算领域具有很大的实用性,值得积极推广使用。关键词:Fortran;Fortran Power Station;静态链接库;模块;编程语言中图分类号院TP313文献标识码院A文章编号院2096-4390渊2023冤26-0088-04资助项目:国家自然科学基金委员会雅砻江联合基金:基于颗粒破碎的堆石料长期变形特性与分数阶弹粘塑性模型研究(编号 U1865104)作者简介:陈彦瑾(2
5、003-),女,本科在读,研究方向:水工岩土工程、有限元数值计算。图 1Fortran Powerstation 4.0 新建文件建立方法88-2023.26 科学技术创新立完成,接下来就可以准备输入静态库程序代码。1.2编写静态链接库程序代码执行 File-New 命令,在新建文件对话框中选择Text File(或工具栏中选择 New Source File),生成Text1 文件,文件类型保存(File-Save)为 Sublib.for,然后输入程序代码。静态链接库的程序代码与一般子程序的编写规则完全一样。程序代码编写完成并存盘后,执 行 工 具 栏 中 Compile 命 令(或 菜
6、单 栏Bulid-Compile Sublib.for)编译 Fortran 程序,此时弹窗提示“This File is not included in the Project”,确认添加即可。Fortran Powerstation 4.0 软件默认的编译模式是Win32 Debug 模式,信息栏中提示编译正常通过之后,会在 Sub 目录下建立 Debug 文件夹并生成 Sublib.obj 文件。执行工具 栏中 Build 命令(或菜单栏Bulid-Bulid Sublib.lib)建立链接库,在 Debug 目录下生成 Sub.lib 文件,此文件即为新建立的静态链接库文件。由于链接库
7、文件一般不需要经常修改,只要声明程序接入点便可使用,因此可以在编译程序时选择Release 模式,以提高执行效率。此时会对应生成Release 目录及相应的 obj 和 lib 文件。如果用来做静态链接库的程序代码已存在,即Sublib.for 文件已有,就只需要将其添加到静态库项目工作空间中去。建立好的项目工作空间(即 ProjecctWorkspace-Static Library)后,执行菜单栏 Insert-Filesinto Project 命令,在弹出的对话框中找到 Sublib.for 程序代码,点击 OK。执行 Compile 和 Bulid 命令后,会对应在 Sub 文件夹的
8、 debug 或 Release 目录生成 Sublib.obj 和 Sub.lib 文件。1.3主程序调用静态链接库主程序代码中不包含链接库代码,主程序调用时只要知道链接库中子程序名称或模块名称即可。假定此时静态库 Sub.lib 文件已经生成,主程序也已经完成。剩下的工作就是如何运行主程序,并调用静态库,完成相应计算任务。在主程序代码 Program Main 后添加语句“!MS$OBJCOMMENT LIB:Sub.lib”可以实现静态库的添加。其中“!”在此处是伪注释的用法,用来声明将 Sub.lib链接库文件添加到主程序中。该行在编译的过程中并不是注释语句,可以与编译器进行通讯,不可
9、缺失。当主程序调用(静态库中的)子程序,如 Sub1 时,只需在主程序代码中需要调用 Sub1 的位置使用 Callsub1 语句来声明调用子程序,其中 Sub1 为子程序名。当然,需要注意的是需将名为 Sub.lib 的链接库文件存放到主程序所在的目录下连接时才可以搜索到。此时,便可打开主程序,如 A.for,执行 Bulid 命令,可以看到编译连接成功,即可执行 Bulid Execute A.exe,主程序会调用静态库中子程序 Sub1 完成计算。1.4含 Module 模块的静态链接库一些程序封装为模块使用起来可能更方便,只要在主程序代码中使用 Use ModD 语句就可调用模块中相应
10、函数及子程序,其中 ModD 为模块名。将 Module模块编译为静态库时,同样要先建立 Static Library 类型的名为 Module 项目工作空间。含 Module 模块的静态库程序代码 Mod.for 结构如下:Module ModDContainsEndSubroutineEndModule中间省略的代码为子程序代码,需要指出此时子程序结束语句应当用 End Subroutine 而不能采用省略Subroutine 的 End 形式。依次执行 Compile 和 Bulid 命令,在 Debug 或 Release 目录下会生成 modd.mod、Mod.obj 文件和 Mod
11、ule.lib 文件。扩展名 mod 文件为模块,lib 文件为静态库文件。主程序接入含 Module 模块的静态库时首先使用语句“!MS$OBJCOMMENT LIB:Module.lib”添加静态库,使用模块时需要用 Use ModD 语句声明使用,使用 Call sub 命令可调用相应的子程序。此处需要注意的是,应将 modd.mod 模块文件和 Module.lib 链接库文件同时存放到主程序的目录下。链接库可以嵌套使用,因此在将 Module 模块编译为链接库时也可调用其他静态库。2静态链接库的更新维护由于不同问题的复杂性,往往要对程序进行不断改进来适应更多的情况,因此就需要对已经生
12、成的静态链接库进行不定期的更新和维护。89-科学技术创新 2023.26首先确认 Sub.mdp 及 Sub.mak 文件存在,执行菜单 栏 File-Open Workspace 命 令,在 Open ProjectWorkspace 窗口中打开 sub.mdp 文件,在项目空间树形菜单中双击 Sublib.for 可修改程序代码文件,修改存盘后执行 Bulid 命令就可以在 Debug 或 Release 目录下建立新的 Sub.Lib 文件。需要指出,静态库进行更新维护后,重新生成了Sub.lib 文件。需将此新静态库文件存放到主程序目录下,而且主程序在使用前必须重新编译连接生成新的A.
13、exe。这是因为旧的可执行程序 A.exe 是将更新前的链接库程序编译到了 A.exe 中,如果只重新链接或只执行旧的可执行程序,则调用的链接库仍为上次编译的更新前的内容,因此,必须重新编译连接主程序代码生成新的 A.exe 方可使用新静态库。3静态链接库使用示例本节结合 Fortran 语言编写的有限元计算程序中一部分功能,详细介绍使用静态链接库的具体步骤。示例子程序的功能为:通过读取线弹性材料的弹性常数弹性模量 E 和泊松比,形成有限元法中使用的物理方程的弹性矩阵 D,计算公式如式(1)。(1)矩阵 D 完全由 E 和 决定,可以把由 E 和 形成 D 的过程建立为静态库,主程序只要提供材
14、料的E 和 值,通过调用静态库中对应的子程序 SubD 即可得到材料弹性矩阵 D。子程序代码见表 1。建立名为 Sub 项目类型为 Static Library 的项目文件目录,添加链接库程序代码 Sublib.for,以 Win32Release 模式执行 Compile 及 Bulid 命令,编译连接程序后会在 Sub 目录下生成 Sub.mak,sub.mdp 文件,Release 目录下生成 Sub.lib、Sublib.obj 文件,其中 Sub.lib 即是所需要的静态库文件,主程序调用时只要在程序代码中声明程序接入点即可调用链接库中子程序。在主程序中使用语句“!MS$OBJCOM
15、MENT LIB:Sub.lib”调用静态库,使用 Call SubD 语句调用静态库中相应子程序。主程序代码如表 2 所示。表 2材料弹性矩阵 D 子程序用 Microsoft Developer Studio 打开主程序代码Main.for 文件,确认之前项目空间关闭后,执行Compile 和 Bulid 命令,编译链接主程序代码。注意,此处需将 Sub 文件夹 Release 目录下的 Sub.lib 文件存放到当前主程序目录下,主程序调用链接库时才可搜索到。当链接库中含有 Module 模块时,项目空间建立方法,需要将 Modd.mod 模块和 Module.lib 链接库文件一并放到
16、主程序目录下方可链接成功。本例输入文件E-v.dat 数据为第一行 2;第二行为 50000.0,0.30;第三行为 100000.0,0.25。执行 Bulid-Bulid Execute Main.exe,输出上述两种材料的 6*6 的弹性矩阵 D,说明主程序调用 Sub.lib链接库的 SubD 子程序形成矩阵 D 是成功的。主程序得到的矩阵 D 结果如下:100011100011100011(1)1 2(1)(1 2)000002(1)1 2000002(1)1 2000002(1)vvvvvvvvvvvvEvDvvvvvvvv表 1材料弹性矩阵 D 子程序行号 代码 行号 代码 1
17、Subroutine SubD(E,v,IM)13 11 D(I+3,I+3)=A*C 2 Dimension D(6,6)14 DO 12 I=1,2 3 COMMON/G/MD(6,6,10)15 JJ=I+1 4 AA=1.0/(1.0-v)16 DO 12 J=JJ,3 5 A=0.5*(1.0-2.0*v)*AA 17 D(I,J)=B*C 6 B=v*AA 18 12 D(J,I)=D(I,J)7 C=E/AA/(1.0+v)/(1.0-2.0*v)19 DO 13 I=1,6 8 DO 10 I=1,6 20 DO 13 J=1,6 9 DO 10 J=1,6 21 13 MD(
18、I,J,IM)=D(I,J)10 10 D(I,J)=0.0 22 Return 11 DO 11 I=1,3 23 End 12 D(I,I)=C 行号 代码 行号 代码 1 Program Main 8 DO IM=1,Mat 2!MS$OBJCOMMENT LIB:Sub.lib 9 E=ME(IM)3 Real ME(10),Mv(10)10 v=Mv(IM)4 COMMON/G/MD(6,6,10)11 Call SubD(E,v,IM)5 Open(3,File=E-v.dat)12 EndDo 6 Read(3,*)Mat !材料总数 13 Write(*,*)MD 7 Read
19、(3,*)(ME(IM),Mv(IM),IM=1,Mat)14 End 90-2023.26 科学技术创新和4结论本文详细的介绍了在 Fortran Powerstation 4.0 环境下建立静态链接库并在主程序中调用静态库里子程序的使用方法,主要结论如下:(1)本文介绍的静态链接库的建立和使用十分方便,可方便地用于大型程序中通用子程序的封装,具有较强的实用价值。(2)静态链接库可以包含多个子程序及 Module模块,静态库之间也可以嵌套使用,主程序亦可以同时调用多个静态库,其适用性很强。(3)Fortran Powerstation4.0 环境下使用静态链接库方法十分简单,只需在主程序代码
20、中添加一行语句,编译连接主程序就可以使用。参考文献1王柯,王远成,刘济洲,等.基于 Fortran 程序对储粮通风温度水分和害虫演替的模拟研究J.中国粮油学报,2021,36(11):123-128.2杨成坤,陈清礼,郑凯,等.基于 QT 与 Fortran 混合编程技术的磁偶极子源正演软件的开发J.物探化探计算技术,2022,44(1):60-67.3齐云飞,胡凡.基于 Fortran 与 VB 混编的水库群联合优化调度系统研究J.黑龙江水利科技,2015,43(6):1-3.4郑少军,严厉.Fortran 语言程序设计的教学探讨J.教育教学论坛,2020(50):303-304.Appli
21、cation of Statically Libraries withFortran LanguageChen Yanjin(College of Water Conservancy and Hydropower Engineering,Hohai University,Nanjing,China)Abstract:Static link library can package code and optimize the program structure effectively.The use ofFortran static link library is not complicated,
22、and large-scale program can be rewritten by the use of staticlibrary,which will undoubtedly bring great convenience.This Paper proposes a simple and practical way tocreate a static link library with Fortran Powerstatio 4.0,and to be called through the main program.Staticlink library has great utilit
23、y,and should be used actively in the field of engineering calculations.Key words:Fortran;Fortran Power Station;static library;module;programming languages673072884628846000288466730728846000288462884667307000(1)000192300000001923000000019230MD120000400004000000040000120000400000004000040000120000000(2)000120000000000120000000000120000MD91-