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中,然后编译程序即可;
-
方法二:若需要经常使用某个链接库时,可通过如下操作实现:
-
首先,设置静态库的读取路径:
工具
→ \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 程序设计.