Fortran程序的编译

01 编译器提供的工具

  • 编译器 (Complier):
    • 用来把程序代码转换成目的文件*(*.obj)或执行文件(*.exe) 的工具,是编译工具的主角;
    • Complier 在编译时不同的设置会编译出不同的机器码,最常见的选项格式有两种,即 Release 和 Debug格式;
  • 链接器(Link) :
    • 用来把 Complier 所生成的目的文件(*.obj)链接成最后的可执行文件(*.exe) 、或是链接库(*.lib、*.dll);
    • 有的编译器执行后会自动调用 Link 来生成执行文件,所以有很多用户不会发现 Link 的存在;
    • 通过目的文件来生成执行文件有几项好处:1)可以把程序拆解成许多小文件来编写;2)可以把不同语言程序代码所生成的 obj 文件链接成一个执行文件。
  • 链接库(Library):
    • 编写 fortran 程序所使用的库存函数,都是事先写好存放在 *.lib 的链接库中。库存函数都是事先写好并存放在这些文件中,Link会自动从这些标准链接库中找到需要的函数;
    • 通常各家编译器会自行额外提供扩充函数,如 visual fortran 专业版中提供的 IMSL。程序员也可以使用编译器来生成自己所要使用的链接库
  • 说明文件(Help)
  • 调试工具 (Debug):
    • 调试工具是很重要的一项功能,它的重要性仅次于 Compiler,好的调试工具可以让程序员快速找到程序代码的错误。
  • 分析工具(Profile):
    • 用来分析程序代码中各个函数所花费的执行时间,可以用来找出程序代码中执行效率最差的部分,程序员可以针对这部分程序代码来作修正。

02 关于编译

2.1 Debug 格式与 Release 格式

  • 通常在程序还未完全开发好时,会使用 Debug 格式来编译程序,而当程序开发成熟后应该使用 Release 格式来编译程序;
  • Release 和 Debug 模式下所编译的程序,在执行效率上有时会有好几倍的差距。

2.2 静态链接库(*.lib)

  • 以 Fortran Static Library 格式编译出来的是 *.lib 的链接库,而不是可以拿来执行的 *.exe 执行文件;

  • 编译链接库时,程序代码中通常不应该出现主程序。链接库是用来提供函数给其他程序员调用,程序进入点应该掌握在其他程序员手中。

  • 编译静态链接库示例:

    文件 → \rightarrow 新建 → \rightarrow 项目 → \rightarrow Intel Visual Fortran → \rightarrow Library → \rightarrow Static Library

    然后写入程序并编译,此时会生成 *.lib 链接库,而不是可以拿来执行的 *.exe 执行文件。

  • 静态链接库的使用

    • 方法一:直接把需要的 .lib 文件找出来并加入到 project中,然后编译程序即可;

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-26U3V41x-1685794449117)(C:\Users\ZHANGYang\Desktop\Typora\image-20230603170932085.png)]

    • 方法二:若需要经常使用某个链接库时,可通过如下操作实现:

      • 首先,设置静态库的读取路径:工具 → \rightarrow 选项 → \rightarrow Intel Compilers and Tools → \rightarrow Visaul Fortran → \rightarrow Compliers,在 Libraries 一栏中加入静态库所在的文件路径并点击确定;

      • 把需要的静态库文件的路径告诉编译器后,还需要跟编译器说明在链接时要使用这个文件:项目 → \rightarrow 属性 → \rightarrow Linker → \rightarrow Input,将所需要的静态库的名称填入 Additional Dependencies 一栏中并点击确定,然后编译程序即可。

注意

  • 如果链接库中编写有 module,则使用链接库时除了 *.lib 之外,还需要 *.mod 文件才能够编译。程序代码中每一个 module 都会编译出相应的 *.mod 文件,而 *.mod 文件不能直接加入到 project 中,必须把其路径添加到 Includes 栏下。
  • 把链接库拿给别人使用前,记得要使用 Release 格式来编译。

2.3 动态链接库(*.dll)

  • 使用静态链接库要事先把程序中所需要使用的函数编译成机器码,保存在 *.lib 文件中,编译器会从 *.lib 文件中找出所需要的函数,并把这些函数的机器码复制一份,放在执行文件中;
  • 动态链接库使用的是另一种技术,它同样是把程序代码中的会使用的函数编译成机器码,只不过是保存在 *.dll 文件中。另外在编译时,不会把函数的机器码复制一份到执行文件。编译器只会在 *.exe 的执行文件里,说明所要调用的函数放在哪一个 *.dll 文件。程序执行使用到这些函数时,Windows 操作系统会把 dll 文件中的函数拿出来给执行文件使用;
  • 在 unix/linux 下也可以使用动态链接库,它们存放在 *.a 文件中;
  • 动态链接库的好处是,可以把很多程序共同使用的函数放在 dll 文件中,让执行文件变小,减小硬盘使用空间。如果使用静态链接库,则每个程序使用的函数,都会复制一份到执行文件中,执行文件会因此变大;
  • dll 文件也容易更新,因为链接库和执行文件分散在不同文件中,只要更新 dll 文件,不需要重新编译执行文件就可以使用新版的链接库;
  • f文件的另一个好处是,它可以很方便地让 fortran 程序给其他语言使用。
  • f使用 fortran 来编写 dll 文件的示例:(使用 fortran 编写 dll 文件,要在程序代码中指明有哪些函数可以被外界调用)
SUBROUTINE EXAMPLE()

!DEC$ ATTRIBUTES DLLEXPORT :: EXAMPLE   
IMPLICIT NONE
PRINT *, 'THIS IS AN EXAMPLE'

END

上述代码示例中,!DEC$ ATTRIBUTES DLLEXPORT :: SUB 是隐含在批注中的命令,它是写给 visual fortran 看的编译功能选项。每个想被外界调用的 dll 函数,都需要使用这个命令才能对外公开使用。没有使用这个命令的函数只能被 dll 文件的函数调用,不能对外公开使用。

  • 编译动态链接库示例:

    文件 → \rightarrow 新建 → \rightarrow 项目 → \rightarrow Intel Visual Fortran → \rightarrow Library → \rightarrow Damic Link Library

点击生成会同时生成 Test.dll 和 Test.lib 两个文件。注意要在编译时链接 Test.dll 文件,仍然要使用 Test.lib 文件(如前所述的两种方法),但要注意这里的 Test.lib 是 Test.dll 的辅助文件,它里面并没有函数的机器码,只有说明这些函数是位于哪个 dll 文件中的信息。

注意

  • 把 Test.lib 加入到项目中,就可以编译出执行文件。但这个时候还不能执行程序,如果试着执行程序,会出现找到 Test.dll 的报错。Test.dll 必须与可执行文件放在相同的目录下,或是把 Test.dll 放在 Windows 操作系统目录下才能使 .exe 文件成功执行。
  • 改变 Test.dll 文件中的输出内容,重新生成 Test.dll,则使用新的 Test.dll 会显示出新的字符串内容,不需要重新编译主程序。
  • 一般的 fortran 程序,大多只是自行使用,没有必要编译成 dll 文件。只有与其他程序语言链接时,才建议使用 dll,如跟 visual c++ 链接。

03 参考文献

[1] 彭国伦. Fortran 95 程序设计.

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值