编程指南
Sun™Studio8
SunMicrosystems,Inc.
部件号817-5800-102004年4月,修订版A请将关于本文档的意见发送至:/hwdocs/feedbacK
版权所有©2004SunMicrosystems,Inc.,4150NetworkCircle,SantaClara,California95054,
U.S.A.保留所有权利。
美国政府权利-商业软件。
政府用户应遵守SunMicrosystems,Inc.标准许可证协议和FAR及其补充材料的适用规定。
使用须服从许可证条款。
本发行物可能包含第三方开发的材料。
本产品的某些部分可能是从BerkeleyBSD系统衍生出来的,并获得了加利福尼亚大学的许可。
UNIX是由X/OpenCompany,Ltd.在美国和其它国家/地区独家许可的注册商标。
Sun、SunMicrosystems、Sun徽标、Java和JavaHelp是SunMicrosystems,Inc.在美国和其它国家/地区的商标或注册商标。
所有SPARC商标的使用均已获得许可,它们是SPARCInternational,Inc.在美国和其它国家/地区的商标或注册商标。
标有SPARC商标的产品都基于由SunMicrosystems,Inc.开发的体系结构。
本产品受“美国出口控制”法律的保护和控制,而且还可能服从其它国家/地区的进出口法律。
严禁将其直接或间接地最终用于核、导弹、生化武器或海上核领域,严禁这些领域的最终用户使用。
严禁将其出口或再出口到美国禁运区或美国出口排除名单中指明的实体,包括但不限于被拒绝的个人和特别指定的国家名单。
本文档按“原样”提供,对所有明示或默示的条件、陈述和担保,包括对适销性、特殊用途的适用性或非侵权性的默示保证,均不承担任何责任,除非此免责声明的适用范围在法律上无效。
请回收 目录 开始之前xiii印刷惯例xiiiShell提示符xv访问SunStudio软件和手册页xv访问编译器和工具文档xvii访问Solaris相关文档xx开发人员资源xxi联系Sun技术支持xxi发送意见xxi
1.简介1–11.1标准一致性1–11.2Fortran95编译器的功能1–21.3其它Fortran公用程序1–21.4调试公用程序1–31.5SunPerformanceLibrary1–31.6区间运算1–31.7手册页1–41.8自述文件1–51.9命令行帮助1–6 iii
2.Fortran输入/输出2–12.1从Fortran程序内部访问文件2–12.1.1访问命名文件2–12.1.2不用文件名打开文件2–32.1.3不用OPEN语句打开文件2–42.1.4向程序传递文件名2–52.2直接I/O2–72.3二进制I/O2–82.4I/O流2–92.5内部文件2–112.6其它I/O注意事项2–13
3.程序开发3–13.1使用make公用程序简化程序构建3–13.1.1Makefile3–13.1.2make命令3–33.1.3宏3–33.1.4覆盖宏值3–43.1.5make中的后缀规则3–43.1.6.KEEP_STATE与特殊依赖性检查3–53.2用SCCS进行版本跟踪和控制3–63.2.1用SCCS控制文件3–63.2.2签出和签入文件3–8
4.库4–14.1认识库4–14.2指定链接程序调试选项4–24.2.1生成加载映射4–24.2.2列出其它信息4–3 ivFortran编程指南•2004年4月 4.2.3编译和链接一致性4–44.3设置库搜索路径和顺序4–5 4.3.1标准库路径的搜索顺序4–54.3.2LD_LIBRARY_PATH环境变量4–54.3.3库搜索路径和顺序—静态链接4–64.3.4库搜索路径和顺序—动态链接4–74.4创建静态库4–94.4.1权衡静态库4–94.4.2简单静态库的创建4–104.5创建动态库4–134.5.1权衡动态库4–134.5.2位置无关代码和–xcode4–144.5.3联编选项4–144.5.4命名惯例4–154.5.5一个简单动态库4–154.5.6初始化公共块4–164.6随SunFortran编译器提供的库4–174.7可发送库4–17
5.程序分析和调试5–15.1全局程序检查(-Xlist)5–15.1.1GPC概述5–15.1.2如何调用全局程序检查5–25.1.3-Xlist和全局程序检查的一些示例5–45.1.4跨例程全局检查的子选项5–75.2特殊编译器选项5–115.2.1下标边界(–C)5–115.2.2未声明的变量类型(–u)5–115.2.3编译器版本检查(–V)5–12 目录v 5.3使用dbx调试5–12
6.浮点运算6–16.1简介6–16.2IEEE浮点运算6–26.2.1–trap=编译器选项6–36.2.2浮点异常6–36.2.3处理异常6–46.2.4捕获浮点异常6–46.2.5非标准运算6–46.3IEEE例程6–66.3.1标志和ieee_flags()6–66.3.2IEEE极值函数6–96.3.3异常处理程序和ieee_handler()6–106.4调试IEEE异常6–166.5更深层次的数值风险6–186.5.1避免简单下溢6–186.5.2以错误答案继续6–196.5.3过度下溢6–196.6区间运算6–21
7.移植7–17.1回车控制7–17.2使用文件7–27.3从科学大型机移植7–27.4数据表示7–37.5霍尔瑞斯数据7–47.6非标准编码措施7–67.6.1未初始化的变量7–6 viFortran编程指南•2004年4月 7.6.2别名使用和-xalias选项7–67.6.3模糊优化7–137.7时间和日期函数7–157.8疑难解答7–187.8.1结果贴近,但不够贴近7–187.8.2程序失败而不警告7–19
8.性能剖析8–18.1SunStudio性能分析器8–18.2time命令8–38.2.1time输出的多处理器解释8–38.3tcov剖析命令8–48.3.1增强的tcov分析8–4
9.性能与优化9–19.1编译器选项的选择9–29.1.1性能选项9–39.1.2其它性能策略9–99.1.3使用已优化的库9–99.1.4消除性能抑制因素9–99.1.5查看编译器注释9–129.2进阶读物9–13 10.并行化10–110.1基本概念10–110.1.1加速—期望目标10–210.1.2程序并行化步骤10–310.1.3数据依赖问题10–410.1.4编译以实现并行化10–610.1.5线程数10–
7 目录vii 10.1.6栈、栈大小和并行化10–710.2自动并行化10–9 10.2.1循环并行化10–910.2.2数组、标量和纯标量10–1010.2.3自动并行化标准10–1010.2.4具有约简操作的自动并行化10–1210.3显式并行化10–1410.3.1可并行化的循环10–1510.3.2OpenMP并行化指令10–2010.3.3Sun风格的并行化指令10–2110.3.4Cray风格的并行化指令10–3210.4环境变量10–3510.4.1PARALLEL和OMP_NUM_THREADS10–3510.4.2SUNW_MP_WARN10–3510.4.3SUNW_MP_THR_IDLE10–3510.5调试并行化程序10–3710.5.1调试时的首要步骤10–3810.5.2使用dbx调试并行代码10–3910.6进阶读物10–41 11.C-Fortran接口11–111.1兼容性问题11–111.1.1函数还是子例程?11–211.1.2数据类型的兼容性11–211.1.3大小写敏感性11–411.1.4例程名中的下划线11–411.1.5按引用或值传递参数11–511.1.6参数顺序11–511.1.7数组索引和顺序11–5 viiiFortran编程指南•2004年4月 11.1.8文件描述符和stdio11–611.1.9库与使用f95命令链接11–711.2Fortran初始化例程11–811.3按引用传递数据参数11–911.3.1简单数据类型11–911.3.2COMPLEX数据11–1011.3.3字符串11–1111.3.4一维数组11–1211.3.5二维数组11–1311.3.6结构11–1411.3.7指针11–1611.4按值传递数据参数11–1911.5返回值的函数11–2111.5.1返回简单数据类型11–2111.5.2返回COMPLEX数据11–2211.5.3返回CHARACTER串11–2411.6带标号的COMMON11–2511.7在Fortran与C之间共享I/O11–2611.8交替返回11–2711.9Fortran2000与C的互操作性11–28索引索引–
1 目录ix xFortran编程指南•2004年4月 表 表1-1表2-1表4-1表5-1表5-2表6-1表6-2表6-3表6-4表7-1表7-2表7-3表7-4表9-1表10-1表10-2表10-3表10-4表10-5表10-
6 需要关注的自述文件1–5csh/sh/ksh命令行重定向和管道2–6随编译器提供的主要库4–17基本的Xlist子选项5–8-Xlist子选项的完整列表5–9ieee_flags(action,mode,in,out)的参数值6–7ieee_flagsin、out参数的含意6–7返回IEEE值的函数6–10ieee_handler(action,exception,handler)的参数数据类型的最大字符数7–4-xalias关键字及其含意7–7Fortran时间函数7–15摘要:非标准VMSFortran系统例程7–17一些有效性能选项9–3并行化选项10–6识别的约简操作10–13显式并行化问题10–17DOALL限定符10–24DOALLSCHEDTYPE限定符10–28DOALL限定符(Cray风格)10–33 6–11 xi 表10-7表11-1表11-2表11-3表11-4表11-5表11-6表11-7表11-8表11-9表11-10表11-11表11-12表11-13表11-14表11-15表11-16表11-17 DOALLCray调度10–34数据大小与对齐—(以字节为单位)按引用传递(f95和)11–3Fortran与C之间的I/O比较11–7传递简单数据类型11–9传递COMPLEX数据类型11–10传递CHARACTER串11–11传递一维数组11–12传递二维数组11–13传递传统FORTRAN77STRUCTURE记录11–14传递Fortran95派生类型11–15传递FORTRAN77(Cray)POINTER11–16在C与Fortran95之间传递简单数据元素11–19返回REAL或Float值的函数11–21返回COMPLEX数据的函数(SPARCV8)11–22返回COMPLEX数据的函数(SPARCV9)11–23返回CHARACTER串的函数11–24模拟带标号的COMMON11–25交替返回11–27 xiiFortran编程指南•2004年4月 开始之前 《Fortran编程指南》提供了有关Sun™StudioFortran95编译器f95的基本信息。
其中介绍了Fortran95的输入/输出、程序开发、库、程序分析与调试、数值精度、移植、性能、优化、并行化以及互操作性。
本指南专供科学工作者、工程技术人员以及具有Fortran语言的应用知识并希望了解如何有效使用Fortran编译器的程序员使用。
另外,我们还假设您大体熟悉Solaris™操作环境或UNIX®。
有关f95编译器环境和命令行选项方面的信息,另请参见手册《Fortran用户指南》。
印刷惯例 表P-
1 字样惯例 字样 AaBbCc123 含义 命令、文件及目录的名称;计算机屏幕输出 示例 编辑.login文件。
使用ls-a列出所有文件。
%Youhavemail. xiii 表P-
1 字样惯例 字样 AaBbCc123 AaBbCc123 含义 键入的内容,用于与计算机屏幕输出相对比 书名、新词或术语、要强调的词语 AaBbCc123 命令行占位文字;用实际名称或值替换 示例 %suPassword: 参阅《用户指南》第6章。
这些称为类选项。
您必须是超级用户才能执行此项操作。
要删除文件,请键入rmfilename。
■符号∆代表空格,此处的空格是有意义的: ∆∆36.001 ■FORTRAN77标准采用了较早的惯例,名称“FORTRAN”用大写字母拼写。
当前的惯例是使用小写字母:“Fortran95” ■对联机手册页的引用以主题名加部分号形式出现。
例如,对库例程GETENV的引用将显示为getenv(3F),这意味着访问该手册页的man命令将是:man-s3Fgetenv。
表P-2代码符号 []{} | : … 代码惯例 含义 方括号中的参数为可选参数。
大括号中包含必需选项的选择集。
“管道”或“竖线”符号用于分隔参数,只能选择其中之
一。
与逗号类似,冒号有时用于分隔参数。
省略号指略去了一个系列项中的某些项。
表示法 O[n]d{y|n} B{dynamic|static}Rdir[:dir]xinline=f1[,…fn] 代码示例 -O4、O-dy -Bstatic -R/local/libs:/U/a -xinline=alpha,dos xivFortran编程指南•2004年4月 Shell提示符 Shell CshellCshell超级用户Bourneshell和KornshellBourneshell和Kornshell的超级用户 提示符 machine-name%machine-name#$ # 访问SunStudio软件和手册页 编译器和工具及它们的手册页并未安装到标准的/usr/bin/和/usr/share/man目录中。
要访问这些编译器和工具,必须正确设置PATH环境变量(参见第xv页中的“访问编译器和工具”)。
要访问手册页,必须正确设置MANPATH环境变量(参见第xvi页中的“访问手册页”)。
有关PATH变量的详细信息,参见csh
(1)、sh
(1)和ksh
(1)手册页。
有关MANPATH变量的详细信息,参见man
(1)手册页。
有关设置PATH变量和MANPATH变量以访问本版本的详细信息,参见安装指南或咨询系统管理员。
注意–本部分中的信息假定您的SunStudio编译器和工具安装在/opt目录中。
如果软件未安装在/opt目录中,请向系统管理员询问您系统中的相当路径。
访问编译器和工具 采用以下步骤确定是否需要更改PATH变量才能访问编译器和工具。
开始之前xv ▼确定是否需要设置PATH环境变量
1.在命令提示符处键入以下命令,显示PATH变量的当前值。
%echo$PATH
2.查看输出结果,查找包含/opt/SUNWspro/bin/的路径字符串。
如果找到了该路径,表明PATH变量已设置为可以访问编译器和工具。
如果未找到该路径,请按照下一过程中的说明设置PATH环境变量。
▼设置PATH环境变量以便能够对编译器和工具进行访问
1.如果使用Cshell,请编辑您起始目录下的.cshrc文件。
如果使用Bourneshell或Kornshell,请编辑您起始目录下的.profile文件。
2.将以下路径添加至PATH环境变量。
如果您已安装了SunONEStudio软件或ForteDeveloper软件,请将以下路径添加到这些安装软件的路径之前。
/opt/SUNWspro/bin 访问手册页 使用下列步骤确定是否需要更改MANPATH变量才能访问手册页。
▼确定是否需要设置MANPATH环境变量
1.在命令提示符处键入以下命令来请求dbx手册页。
%mandbx
2.查看输出结果(如果有)。
如果无法找到dbx
(1)手册页,或者所显示的手册页并非对应于所安装软件的当前版本,请按照下一过程中的说明设置MANPATH环境变量。
xviFortran编程指南•2004年4月 ▼设置MANPATH环境变量以便能够对手册页进行访问
1.如果使用Cshell,请编辑您起始目录下的.cshrc文件。
如果使用Bourneshell或Kornshell,请编辑您起始目录下的.profile文件。
2.将以下路径添加至MANPATH环境变量。
/opt/SUNWspro/man 访问集成开发环境 SunStudio8集成开发环境(IDE)提供了用于创建、编辑、生成、调试以及分析
C、C++或Fortran应用程序性能的模块。
此IDE需要SunStudio8的核心平台组件。
如果核心平台组件没有安装在下列位置之
一,必须将SPRO_NETBEANS_HOME环境变量设置为核心平台组件的安装位置(installation_beans/3.5R):■缺省安装目录/beans/3.5R■与SunStudio8编译器和工具组件相同的位置(例如,编译器和工具组件安装在 /foo/SUNWspro,核心平台组件安装在/beans/3.5R)用于启动IDE的命令是sunstudio。
有关此命令的详细信息,参见sunstudio
(1)手册页。
访问编译器和工具文档 可在下列位置访问文档:■文档可从随软件一同安装在本地系统或网络上的文档索引中获得,位置在 file:/opt/SUNWspro/docs/index.html。
如果软件未安装在/opt目录中,请向系统管理员询问您系统中的相当路径。
开始之前xvii ■大多数手册都可以从sm网站获得。
下列书目只能通过所安装的软件得到:■《标准C++库类参考》■《标准C++库用户指南》■《Tools.h++类库参考》■《Tools.h++用户指南》 ■发行说明可从网站获得。
■可通过[帮助]菜单获得IDE所有组件的联机帮助,也可通过IDE许多窗口和对话 框中的[帮助]按钮来获得。
在网站()上,您可以通过因特网阅读、打印和购买SunMicrosystems的手册。
如果找不到手册,参见随软件一同安装在本地系统或网络上的文档索引。
注意–Sun对本文档中提及的第三方网站的可用性概不负责,并且不认可也不对此类站点或资源上或通过其获得的任何内容、广告、产品或其它资料负任何责任或义务。
对于因使用或信赖此类站点或资源中提供或通过其提供的任何此类内容、商品或服务而导致或声称导致或与之有关的任何损害或损失,Sun将不负任何责任或义务。
易访问格式文档 我们还提供了易访问格式的文档,便于残疾用户通过辅助技术阅读。
您可以按下表所述找到文档的易访问版本。
如果软件未安装在/opt目录中,请向系统管理员询问您系统中的相当路径。
文档类型 手册(不包括第三方手册)第三方手册:•《标准C++库类参考》•《标准C++库用户指南》•《Tools.h++类库参考》•《Tools.h++用户指南》自述文件和手册页 联机帮助发行说明 易访问版本的格式和位置 HTML格式,位于HTML格式,在已安装软件中通过文档索引访问,位置在file:/opt/SUNWspro/docs/index.html HTML格式,在已安装软件中通过文档索引访问,位置在file:/opt/SUNWspro/docs/index.htmlHTML格式,可通过IDE的[帮助]菜单获得HTML格式,位于 xviiiFortran编程指南•2004年4月 相关编译器和工具文档 下表介绍了可在file:/opt/SUNWspro/docs/index.html和上获得的相关文档。
如果软件未安装在/opt目录中,请向系统管理员询问您系统中的相当路径。
文档名称 《Fortran用户指南》 《Fortran库参考》《OpenMPAPI用户指南》 《数值计算指南》 说明 介绍f95编译器的编译时环境以及命令行选项。
另外还包括传统f77程序到f95的迁移指导。
详细介绍Fortran库和内在例程概述OpenMP多重处理API,并说明与实现有关的细节。
说明浮点计算数值精度涉及到的问题。
开始之前xix 访问Solaris相关文档 下表介绍可通过网站获得的相关文档。
文档集 Solaris参考手册集Solaris软件开发人员集Solaris软件开发人员集 文档名称 参见手册页各部分的书名。
《链接程序和库指南》《多线程编程指南》 说明 提供Solaris操作环境的有关信息。
介绍Solaris链接编辑器及运行时链接程序的操作。
内容包括POSIX和Solaris线程API、使用同步对象编程、编译多线程程序以及查找多线程程序工具。
下表介绍可通过网站获得的相关文档。
文档集 Solaris参考手册集Solaris软件开发人员集Solaris软件开发人员集 文档名称 参见手册页各部分的书名。
《链接程序和库指南》《多线程编程指南》 说明 提供Solaris操作环境的有关信息。
介绍Solaris链接编辑器及运行时链接程序的操作。
内容包括POSIX和Solaris线程API、使用同步对象编程、编译多线程程序以及查找多线程程序工具。
xxFortran编程指南•2004年4月 开发人员资源 访问可找到以下经常更新的资源:■介绍编程技术和最佳办法的文章■内含简短编程技巧的知识库■编译器和工具组件文档,以及对随软件安装文档的更正■支持级别信息■用户论坛■可下载代码范例■新技术预见还可以在上找到其它开发人员资源。
联系Sun技术支持 如果您对于本产品有任何技术问题在本文档中找不到答案,请访问:/service/contacting 发送意见 Sun一直致力于提高其文档质量,欢迎您提出意见和建议。
请将您的意见通过电子邮件发送给Sun,邮件地址:docfeedback@请在您电子邮件的主题行中加入文档的部件号(817-5800-10)。
开始之前xxi xxiiFortran编程指南•2004年4月 第1章 1.1 简介 本书与《Fortran用户指南》所介绍的Sun™StudioFortran95编译器(f95)可在SPARC®和UltraSPARC®平台的Solaris™操作环境下使用。
该编译器符合已发布的Fortran语言标准,并提供了多种扩展功能,其中包括多处理器并行化、完善的代码优化编译以及C/Fortran语言混合支持。
f95编译器还提供Fortran77兼容模式,可接受大多数传统Fortran77源代码。
该编译器集合不再包括单独的Fortran77编译器。
有关FORTRAN77兼容性及迁移问题的信息,参见《Fortran用户指南》第5章。
标准一致性 ■f95的设计目标是兼容ANSIX3.198-1992、ISO/IEC1539:1991和ISO/IEC1539:1997标准文档。
■浮点运算基于IEEE标准754-1985和国际标准IEC60559:1989。
■f95对SPARCV8和SPARCV9(包括UltraSPARC实现)的优化利用功能提供支 持。
这些功能在Prentice-Hall为SPARCInternational发行的《SPARC体系结构手册》第8版(ISBN0-13-825001-4)和第9版(ISBN0-13-099227-5)中进行了定义。
■在本文档中,“标准”意味着符合以上所列标准版本。
“非标准”或“扩展”是指超出这些标准版本的功能。
标准负责团体可能会不时地修订这些标准。
这些编译器所遵循的适用标准的版本可能会进行修订或更替,从而导致SunFortran编译器后期版本功能与早期版本不兼容。
1-
1 1.2 Fortran95编译器的功能 SunStudioFortran95编译器提供下列功能和扩展:■跨越例程的全局程序检查,以保证变量、公共块、参数等的一致性。
■用于多处理器系统经过优化的自动和显式循环并行化。
■VAX/VMSFortran扩展,包括: ■结构、记录、联合、映射■递归■OpenMP并行化指令。
■Cray风格的并行化指令,其中包括TASKCOMMON。
■全局、细部及潜在的并行优化会产生高性能的应用程序。
基准测试显示,与未经过优化的代码相比,经过优化的应用程序运行速度明显加快。
■Solaris系统的通用调用惯例允许将用C或C++编写的例程与Fortran程序合并在一起。
■支持UltraSPARC平台上的具有64位能力的Solaris环境。
■使用%VAL进行按值调用。
■Fortran77和Fortran95程序及目标二进制代码间的兼容性。
■“区间运算”编程。
■某些“Fortran2000”功能,包括“I/O流”。
有关随各软件版本添加到编译器中的新增和扩展功能的详细信息,参见《Fortran用户指南》附录
B。
1.3 其它Fortran公用程序 下列公用程序在用Fortran开发软件程序时可起到辅助作用:■SunStudio性能分析器—单线程和多线程应用程序深层性能分析工具。
参见 analyzer
(1)。
■asa—该Solaris公用程序是一个Fortran输出过滤器,用于打印在第一列中含有 Fortran回车控制符的文件。
使用asa可将用Fortran回车控制惯例格式化的文件转换成按UNIX行式打印机惯例格式化的文件。
参见asa
(1)。
■fdumpmod—用于显示文件或归档文件中所含模块名称的公用程序。
参见fdumpmod
(1)。
■fpp—一个Fortran源代码预处理程序。
参见fpp
(1)。
1-2Fortran编程指南•2004年4月 1.41.51.6 ■fsplit—该公用程序将具有若干例程的一个Fortran文件分成若干个文件,每个文件一个例程。
可对FORTRAN77或Fortran95源文件使用fsplit。
参见fsplit
(1)。
调试公用程序 有下列调试公用程序可用:■-Xlist—用于跨例程检查参数、COMMON块等项一致性的编译器选项。
■SunStudiodbx—提供强大、功能丰富的运行时和静态调试器,还包括一个性能数 据收集器。
SunPerformanceLibrary SunPerformanceLibrary™是用于计算线性代数和傅立叶变换的经过优化的子例程及函数库。
它建立在标准库LAPACK、BLAS1、BLAS2、BLAS3、FFTPACK、VFFTPACK和LINPACK基础之上,这些标准库通常可通过Netlib()获得。
SunPerformanceLibrary中的每个子程序均执行相同的操作,并且与标准库版本具有相同的接口,但通常速度更快、更精确,并且可用于多处理环境。
有关详细信息,参见performance_library自述文件和《SunPerformanceLibrary用户指南》。
(性能库例程手册页见第3P部分。
) 区间运算 Fortran95编译器提供-xia和-xinterval编译器标志,以启用新语言扩展并生成适当代码来实现区间算术计算。
有关详细信息,参见《Fortran95区间运算编程参考》。
第1章简介1-
3 1.7 手册页 联机手册(man)页提供命令、函数、子例程及其相应集合的直接文档。
要访问SunStudio手册页,参见“前言”部分对MANPATH环境变量进行正确设置。
可以通过运行以下命令来显示手册页: demo%ic 在整个Fortran文档中,手册页参考均以主题名加手册部分编号形式出现:f95
(1)用manf95来访问。
其它部分,以ieee_flags(3M)为例,使用带-s选项的man命令访问: demo%man-s3Mieee_flags Fortran库例程编录在手册页第3F部分。
下面列出了Fortran用户需关注的手册页: f95(1)analyzer(1)asa(1)dbx(1)fpp(1)cpp(1)fdumpmod(1)fsplit(1)ieee_flags(3M)ieee_handler(3M)matherr(3M)ild(1)ld
(1) Fortran95命令行选项SunStudio性能分析器Fortran回车控制打印输出后处理程序命令行交互式调试器Fortran源代码预处理程序C源代码预处理程序显示“模块”(.mod)文件的内容。
此预处理程序可将Fortran源例程分成单个文件检查、设置或清除浮点异常位处理浮点异常数学库错误处理例程用于目标文件的增量式链接编辑器用于目标文件的链接编辑器 1-4Fortran编程指南•2004年4月 1.8 自述文件 READMEs目录下包含的文件描述新增功能、软件不兼容性、错误以及手册印刷后发现的信息。
该目录的位置取决于软件安装位置。
路径为:/opt/SUNWspro/READMEs/。
表1-
1 需要关注的自述文件 自述文件 fortran_95 fpp_readmeinterval_arithmeticmath_librariesprofiling_toolsruntime_librariesperformance_library 描述... 本版Fortran95编译器(f95)的新增及更改功能、已知限制、文档勘误。
fpp功能及能力概述f95区间运算功能概述。
可用的优化及专用数学库。
使用性能剖析工具,prof、gprof和tcov。
依据最终用户许可证条款可以重新分发的库及可执行文件。
SunPerformanceLibrary概述 用-xhelp=readme命令行选项,可以很方便地查看每个编译器的自述文件。
例如,命令: %f95-xhelp=readme 将直接显示fortran_95自述文件。
第1章简介1-
5 1.9 命令行帮助 调用编译器的-help选项,可以查看f95命令行选项的扼要说明,如下所示: %f95-help=flags []内为可选项。
<>内为可变参数项。
竖线|表示文字值的选择。
-someoption[={yes|no}]隐含表示-someoption与-someoption=yes等效 _______________________________________________________________ -a 收集tcov基本块剖析数据 mon[=]按指定的边界要求对齐公共块元素;={1|2|4|8|16} -ansi 报告非ANSI扩展。
ar 启用自动循环并行化 -Bdynamic 允许动态链接 -Bstatic 需要静态链接 -
C 启用运行时下标范围检查 -c 仅编译;生成.o文件,但禁止链接 ...其它 1-6Fortran编程指南•2004年4月 第2章 Fortran输入/输出 本章介绍SunStudioFortran95编译器提供的输入/输出功能。
2.1 2.1.1 从Fortran程序内部访问文件 数据通过Fortran逻辑单元在程序、设备或文件间进行传送。
逻辑单元在I/O语句中用逻辑单元号来标识,逻辑单元号是从0到最大4字节整数值(2,147,483,647)的非负整数。
字符*可以作为逻辑单元标识符出现。
当星号出现在READ语句中时,它代表标准输入文件;当它出现在WRITE或PRINT语句中时,代表标准输出文件。
Fortran逻辑单元可通过OPEN语句与特定的命名文件相关联。
另外,在程序开始执行时,某些预连接单元会自动与特定文件相关联。
访问命名文件 OPEN语句的FILE=说明符在运行时建立逻辑单元到命名物理文件的关联。
该文件可以是预先就有的,也可以由程序创建。
OPEN语句中的FILE=说明符可以指定一个简单文件名(FILE='myfile.out'),也可以指定一个前面带有绝对或相对目录路径的文件名(FILE='../Amber/Qproj/myfile.out')。
另外,说明符还可以是字符常量、变量或字符表达式。
可以使用库例程将命令行参数和环境变量以字符变量形式送入程序中,用作OPEN语句中的文件名。
2-
1 以下示例(GetFilNam.f)展示了一种由键入的名称来构建绝对路径文件名的方法。
程序使用库例程GETENV、LNBLNK和GETCWD返回$HOME环境变量的值、查找字符串 中最后的非空格字符、确定当前工作目录: CHARACTERF*128,FN*128,FULLNAME*128PRINT*,'ENTERFILENAME:'READ*,FFN=FULLNAME(F)PRINT*,'PATHIS:',FNEND CHARACTER*128FUNCTIONFULLNAME(NAME) CHARACTERNAME*(*),PREFIX*128
C ThisassumesCshell.
C Leaveabsolutepathnamesunchanged.
C Ifnamestartswith'~/',replacetildewithhome
C directory;otherwiseprefixrelativepathnamewith
C pathtocurrentdirectory. IF(NAME(1:1).EQ.'/')THEN FULLNAME=NAME ELSEIF(NAME(1:2).EQ.'~/')THEN CALLGETENV('HOME',PREFIX) FULLNAME=PREFIX(:LNBLNK(PREFIX))//
1 NAME(2:LNBLNK(NAME)) ELSE CALLGETCWD(PREFIX) FULLNAME=PREFIX(:LNBLNK(PREFIX))//
1 '/'//NAME(:LNBLNK(NAME)) ENDIF RETURN END 编译并运行GetFilNam.f,结果如下: demo%pwd/home/users/auser/subdirdemo%f95-ogetfilGetFilNam.fdemo%getfil ENTERFILENAME:getfil PATHIS:/home/users/auser/subdir/atest.f demo% 2-2Fortran编程指南•2004年4月 2.1.2 2.1.2.1 2.1.2.22.1.2.3 这些例程将在第2-5页中的“向程序传递文件名”中进一步说明。
有关详细信息,参见与getarg(3F)、getcwd(3F)和getenv(3F)相应的手册页条目;这些内容以及其它有用的库例程在《Fortran库参考》中也有介绍。
不用文件名打开文件 OPEN语句不需要指定名称;运行系统会依据若干惯例提供文件名。
打开作为临时文件 在OPEN语句中指定STATUS='SCRATCH',会打开一个名称形如tmp.FAAAxnnnnn的文件,其中,nnnnn用当前进程ID代替,AAA是三个字符的字符串,x是一个字母;AAA和x可保证文件名唯
一。
该文件在程序终止或执行CLOSE语句时被删除。
当在FORTRAN77兼容模式(-f77)下编译时,可以在CLOSE语句中指定STATUS='KEEP'来保留这个临时文件。
(此为非标准扩展。
) 已打开 如果文件已被程序打开,可以使用后续的OPEN语句来更改文件的某些特性;例如BLANK和FORM。
此时,只需指定文件的逻辑单元号以及要更改的参数。
预连接或隐式命名单元 程序执行开始时,会自动将三个单元号与特定的标准I/O文件相关联。
这些预连接单元是标准输入、标准输出以及标准错误:■标准输入是逻辑单元5■标准输出是逻辑单元6■标准错误是逻辑单元0通常,标准输入从工作站键盘接受输入;标准输出和标准错误在工作站屏幕上显示输出。
在其它所有情况下,如果在OPEN语句中指定了逻辑单元号而未在FILE=后指定任何名称,文件将以形如fort.n的名称打开,其中n为逻辑单元号。
第2章Fortran输入/输出2-
3 2.1.3 不用OPEN语句打开文件 在假定使用缺省惯例的情况下,不必非得使用OPEN语句。
如果逻辑单元上的第一个操作是I/O语句,而不是OPEN或INQUIRE,会引用文件fort.n,其中n为逻辑单元号(0、5和6除外,它们有特殊意义)。
这些文件无需在程序执行前就存在。
如果对文件的第一个操作不是OPEN或INQUIRE语句,则会创建这些文件。
示例:以下代码中,如果WRITE是该单元上的第一个输入/输出操作,则会创建文件fort.25: demo%catTestUnit.fIU=25WRITE(IU,'(I4)')IUEND demo% 上述程序将打开文件fort.25,并将一条格式化记录写入该文件: demo%demo%demo% 25demo% f95-otestunittestunitcatfort.25 TestUnit.f 2-4Fortran编程指南•2004年4月 2.1.4 2.1.4.1 2.1.4.2 向程序传递文件名 文件系统没有任何自动便利机制可将Fortran程序中的逻辑单元号与物理文件相关联。
但是,有若干种令人满意的方式可将文件名传给Fortran程序。
通过运行时参数和GETARG 可以使用库例程getarg(3F)在运行时将命令行参数读入一个字符变量。
参数会被解释为文件名并在OPEN语句的FILE=说明符中使用: demo%cattestarg.fCHARACTERoutfile*40 CGetfirstargasoutputfilenameforunit51CALLgetarg(1,outfile)OPEN(51,FILE=outfile)WRITE(51,*)'Writingtofile:',outfileEND demo%f95-otstargtestarg.fdemo%tstargAnyFileNamedemo%catAnyFileName Writingtofile:AnyFileNamedemo% 通过环境变量和GETENV 同样,可以使用库例程getenv(3F)在运行时将任何环境变量的值读入一个字符变量,该变量随后被解释为文件名: demo%cattestenv.fCHARACTERoutfile*40 CGet$OUTFILEasoutputfilenameforunit51CALLgetenv('OUTFILE',outfile)OPEN(51,FILE=outfile)WRITE(51,*)'Writingtofile:',outfileEND demo%f95-otstenvtestenv.fdemo%setenvOUTFILEEnvFileNamedemo%tstenvdemo%catEnvFileName Writingtofile:EnvFileNamedemo% 第2章Fortran输入/输出2-
5 2.1.4.3 使用getarg或getenv时,应该注意前导或尾随的空格。
(Fortran95程序可以使用内在函数TRIM或更早的FORTRAN77库例程LNBLNK())在本章开头的示例中,可以随FULLNAME函数的代码行编写更加灵活的代码来接受相对路径名。
命令行I/O重定向和管道 将物理文件与程序的逻辑单元号相关联的另一方法是通过重定向或管道输送预连接的标准I/O文件。
重定向或管道在运行时执行命令中使用。
采用这种方式,读取标准输入(单元5)和写至标准输出(单元6)或标准错误(单元0)的程序可以通过重定向(在命令行中使用<、>、>>、>&、|、|&、2>、2>&1),读或写至其它任何命名文件。
参见下表: 表2-
1 csh/sh/ksh命令行重定向和管道 操作 标准输入—从mydata读入数据标准输出—写至(覆写)myoutput标准输出—写/追加至myoutput 将标准错误重定向至文件 将标准输出通过管道输送至另一程序的输入 将标准错误和输出通过管道输送至另一程序 使用CShell myprogmyoutputmyprog>>myoutputmyprog>&errorfilemyprog1|myprog2myprog1|&myprog2
使用Bourne或KornShell
myprogmyoutputmyprog>>myoutputmyprog2>errorfilemyprog1|myprog2myprog12>&1|myprog2
有关命令行重定向和管道的详细信息,参见csh、ksh和sh手册页。
2-6Fortran编程指南•2004年4月 2.2 直接I/O 直接或随机I/O允许直接通过记录号访问文件。
记录号在写入记录时分配。
与顺序I/O不同,直接I/O记录可以按任何顺序读写。
但是,在直接访问文件中,所有记录必须具有相同的固定长度。
直接访问文件用文件OPEN语句中的ACCESS='DIRECT'说明符声明。
直接访问文件中的逻辑记录是字节字符串,串长度由OPEN语句的RECL=说明符指定。
READ和WRITE语句指定的逻辑记录不能大于所定义的记录大小。
(记录大小以字节单位指定。
)允许更短的记录。
直接写入非格式化数据将使记录的未填写部分仍保持未定义。
直接写入格式化数据将使未填写的记录用空格进行填充。
直接访问READ和WRITE语句另外还有一个参数REC=n,用来指定要读取或写入的记录号。
示例:直接访问,非格式化: OPEN(
2,FILE='data.db',ACCESS='DIRECT',RECL=200, & FORM='UNFORMATTED',ERR=90) READ(
2,REC=13,ERR=30)
X,Y 本程序以直接访问、非格式化I/O、记录固定长度为200字节的方式打开一个文件,然后将第十三条记录读入X和
Y。
示例:直接访问,格式化: OPEN(
2,FILE='inven.db',ACCESS='DIRECT',RECL=200, & FORM='FORMATTED',ERR=90) READ(
2,FMT='(I10,F10.3)',REC=13,ERR=30)
X,Y 本程序以直接访问、格式化I/O、记录固定长度为200字节的方式打开一个文件。
然后读取第十三条记录,并以(I10,F10.3)格式对其进行转换。
对于格式化文件,所写记录的大小由FORMAT语句确定。
在上述示例中,FORMAT语句所定义的记录大小为20个字符或字节。
如果列表中的数据总量大于FORMAT语句中指定的记录大小,则可通过单条格式化写入指令写入一条以上的记录。
在此种情况下,会为随后的每一条记录赋予连续的记录号。
示例:直接访问、格式化、多记录写入: OPEN(21,ACCESS='DIRECT',RECL=200,FORM='FORMATTED')WRITE(21,'(10F10.3)',REC=11)(X(J),J=1,100) 第2章Fortran输入/输出2-
7 2.3 写至直接访问单元21的写指令会创建10条记录,每条记录10个元素(因为格式指定每条记录10个元素),这些记录从11到20进行编号。
二进制I/O SunStudioFortran95扩展了OPEN语句,允许声明“二进制”I/O文件。
用FORM='BINARY'打开文件与用FORM='UNFORMATTED'打开文件所达到的效果大致相同,除了不会在文件中嵌入任何记录长度。
没有该数据,将无法判断一条记录的开始或结束位置。
因而,不能在FORM='BINARY'文件中执行BACKSPACE,因为无法判断回退的位置。
对'BINARY'文件执行READ,将会根据需要读取尽可能多的数据来填充输入列表中的变量。
■WRITE语句:将数据以二进制形式写入文件,根据输出列表指定的数量传送尽量多 的字节。
■READ语句:将数据读入输入列表中的变量,按列表要求传送尽量多的字节。
由于文 件中无记录标记,因而不会检测到“记录结束”错误。
只能检测到“文件结束”或系统异常错误。
■INQUIRE语句:对用FORM=”BINARY”打开的文件执行INQUIRE会返回以下结果:FORM=”BINARY”ACCESS=”SEQUENTIAL”DIRECT=”NO”FORMATTED=”NO”UNFORMATTED=”YES”RECL=和NEXTREC=未定义■BACKSPACE语句:不允许—会返回错误。
■ENDFILE语句:与通常一样在当前位置截断文件。
■REWIND语句:与通常一样将文件重新定位至数据开头。
2-8Fortran编程指南•2004年4月 2.4 I/O流 新的I/O“流”方案已被提议作为Fortran2000标准草案的一部分,并且在f95中得以实现。
I/O流式访问将数据文件视作连续的字节序列,用从1开始的正整数来寻址。
可用OPEN语句中的ACCESS=’STREAM’说明符来定义I/O流文件。
字节地址文件定位需要在READ或WRITE语句中有POS=scalar_integer_expression说明符。
INQUIRE语句接受ACCESS=’STREAM’、说明符STREAM=scalar_character_variable以及POS=scalar_integer_variable。
第2章Fortran输入/输出2-
9 流I/O在与C程序创建或读取的文件进行互操作时非常有用,如下例所示: Fortran95程序读取由Cfwrite()创建的文件。
programreaderinteger::a(1024),i,resultopen(file="test",unit=8,ess="stream",form="unformatted") !
readallofaread(8)adoi=1,1024if(a(i).ne.i-1)print*,’errorat’,ienddo !
readthefilebackwarddoi=1024,
1,-1read(8,pos=(i-1)*4+1)resultif(result.ne.i-1)print*,’errorat’,ienddoclose
(8) end C程序写入一个文件 #includeintbinary_data[1024];
/*Createafilewith102432-bitintegers*/intmain(void){
inti;FILE*fp;
for(i=0;i<1024;++i)binary_data[i]=i;
fp=fopen("test","w");fwrite(binary_data,sizeof(binary_data),1,fp);fclose(fp);}
C程序使用Cfwrite()将1024个32位整数写入文件中。
Fortran95读取程序以数组方式一次读取这些数据,然后再在文件中从后往前分别读取它们。
第二条read语句中的pos=说明符说明位置是用字节表示的,从字节1开始(这一点与C相反,在C中,位置从字节0开始)。
2-10Fortran编程指南•2004年4月 2.5 内部文件 内部文件是CHARACTER类型的对象,如变量、子串、数组、数组元素或者结构记录的字段。
内部文件READ可以来自常量字符串。
内部文件I/O通过由一个字符对象向另一数据对象传送和转换数据,模拟格式化READ和WRITE语句。
不执行任何文件I/O。
使用内部文件时:■出现在WRITE语句中的是接收数据的字符对象的名称而非单元号。
在READ语句 中,出现的也是字符对象源的名称而非单元号。
■常量、变量或子串对象构成文件中的单条记录。
■使用数组对象,每个数组元素对应于一条记录。
■内部文件上的直接I/O。
(Fortran95标准只包括内部文件上的顺序格式化I/O。
) 除了不能更改文件中的记录数之外,这一点与外部文件上的直接I/O相似。
此时,记录是字符串数组的单个元素。
这项非标准扩展仅在用-f77标志进行编译时的FORTRAN77兼容模式下可用。
■每一顺序READ或WRITE语句均始于内部文件的开头。
示例:从内部文件(仅有一条记录)中以顺序、格式化方式进行读取: demo%catintern1.fCHARACTERX*80READ(*,'(A)')XREAD(
X,'(I3,I4)')N1,N2!
ThiscodelinereadstheinternalfileXWRITE(*,*)N1,N2END demo%f95-otstinternintern1.fdemo%tstintern 12991299demo% 第2章Fortran输入/输出2-11 示例:从内部文件(三条记录)中以顺序、格式化方式进行读取: demo% demo%demo% 81demo% catintern2.fCHARACTERLINE
(4)*16DATALINE
(1)/'8181'/DATALINE
(2)/'8282'/DATALINE
(3)/'8383'/DATALINE
(4)/'8484'/READ(LINE,'(2I4)')
I,J,
K,L,
M,NPRINT*,
I,J,
K,L,
M,NENDf95intern2.fa.out 8182828383 示例:在-f77兼容模式下,从内部文件(一条记录)中以直接访问方式进行读取: demo%catintern3.f CHARACTERLINE
(4)*16 DATALINE
(1)/'8181'/ DATALINE
(2)/'8282'/ DATALINE
(3)/'8383'/ DATALINE
(4)/'8484'/ READ(LINE,FMT=20,REC=3)
M,N 20 FORMAT(I4,I4) PRINT*,
M,N END demo%f95-f77intern3.f demo%a.out 8383 demo% 2-12Fortran编程指南•2004年4月 2.6 其它I/O注意事项 Fortran95及传统Fortran77程序在I/O上是兼容的。
包含f77和f95混合编译代码的可执行文件可以同时从程序的f77和f95部分对同一单元执行I/O。
但是,Fortran95还提供了一些附加功能:■ADVANCE='NO'允许进行非提前式I/O,如下所示: write(*,'(a)',ADVANCE='NO')'Entersize='read(*,*)n ■NAMELIST输入功能:■f95允许在输入时在组名前冠以$或&。
Fortran95标准只接受&,并且此为NAMELIST写语句的输出内容。
■f95接受$作为输入组的终止符号,除非组中的最后一个数据项为CHARACTER,此时,$被视为输入数据。
■f95允许NAMELIST输入开始于记录的第一列。
■正如f77所做的那样,f95承认并实现了ENCODE和DECODE。
有关f95与f77间的Fortran95I/O扩展及兼容性方面的其它信息,参见《Fortran用户指南》。
第2章Fortran输入/输出2-13 2-14Fortran编程指南•2004年4月 第3章 程序开发 本章简要介绍两个功能强大的程序开发工具make和SCCS,这两个工具可以非常成功地用于Fortran编程项目。
目前有许多关于使用make和SCCS的优秀的商业出版书籍,其中包括ManagingProjectswithmake(AndrewOram和SteveTalbott著)和ApplyingRCSandSCCS(DonBolinger和TanBronson著)。
这两本书均出自O’Reilly&Associates。
3.1 3.1.1 使用make公用程序简化程序构建 make公用程序可以智能地执行程序编译和链接任务。
大型应用程序通常由一组源文件和INCLUDE文件组成,同时要求与许多库进行链接。
修改任何一个或多个源文件需要重新编译程序的修改部分并重新链接。
通过指定组成应用程序的文件间的相互依赖性以及重新编译和重新链接每一程序块所需的命令,可以自动执行这一过程。
只要在指令文件中包括这些说明,make便会确保只重新编译那些需要重新编译的文件,并确保重新链接使用所需的选项和库来生成可行性文件。
以下讨论内容提供了一个如何使用make的简单示例。
有关摘要信息,参见make(1S)。
Makefile 名为makefile的文件以结构化方式告知make都有哪些源文件和目标文件依赖其它文件。
它还定义了编译和链接文件所需的命令。
3-
1 例如,假设您的程序有四个源文件以及相应的makefile文件: demo%lsputepts.fpattern.fstartupcore.fdemo% 假设pattern.f和putepts.f都有一个名为monblock的INCLUDE,并且您希望编译每个.f文件并将这三个可重定位的文件与一系列库一起链接成一个名为pattern的程序。
这时,makefile将会如下所示: demo%catmakefilepattern:putepts.ostartupcore.o f95putepts.ostartupcore.o–lcore95\–lcore–lsunwindow–lpixrect–opatternpattern.o:monblockf95–c–uputepts.o:monblockf95–c–putepts.fstartupcore.o:startupcore.ff95–c–ustartupcore.fdemo% makefile的第一行指示pattern的创建取决于pattern.o、putepts.o和startupcore.o。
下一行及其后续各行给出了由可重定位的.o文件和库创建pattern的命令。
makefile中的每一条都是一项规则,它描述了目标对象的依赖性以及创建该对象所需的命令。
规则的结构为:target:dependencies-listTABmands■依赖性。
每条的头一行均是为目标文件命名,其后是目标依赖的所有文件。
■命令。
每条随后还有一行或多行,这些行指定将生成本条相应的目标文件的Bourne shell命令。
这些命令行中的每一行都必须用一个制表符缩进。
3-2Fortran编程指南•2004年4月 3.1.23.1.3 make命令 make命令可以进行无参数调用,只需键入: demo%make make公用程序在当前目录中寻找名为makefile或Makefile的文件并从该文件中获取指令。
make公用程序:■读取makefile,确定其必须处理的所有目标文件、这些目标文件依赖的文件以及 生成这些目标文件所需的命令。
■查找每个文件的最后更改日期和时间。
■如果有任何目标文件比其依赖的任一文件时间更久,使用makefile中与该目标相 应的命令重新生成该目标文件。
宏 make公用程序的宏功能允许进行简单的无参数字符串替换。
例如,可将组成目标程序pattern的可重定位文件的列表表示为单个宏字符串,使其更易于更改。
宏字符串定义具有以下格式:NAME=string宏字符串的使用方式如下所示:$(NAME)make会用宏字符串的实际值来替换它。
以下示例将命名所有目标文件的宏定义添加到makefile的开头: OBJ=putepts.ostartupcore.o 现在便可在依赖性列表以及与makefile中的目标pattern相应的f95链接命令中同时使用宏了。
pattern:$(OBJ)f95$(OBJ)–lcore95–lcore–lsunwindow\–lpixrect–opattern 第3章程序开发3-
3 3.1.43.1.5 对于名称为单个字母的宏字符串,可以省略括号。
覆盖宏值 make宏的初始值可以用make的命令行选项进行覆盖。
例如: FFLAGS=–uOBJ=putepts.ostartupcore.opattern:$(OBJ) f95$(FFLAGS)$(OBJ)–lcore95–lcore–lsunwindow\–lpixrect–opatternpattern.o:monblockf95$(FFLAGS)-cputepts.o:f95$(FFLAGS)–putepts.f 现在,简单的无参数make命令将会使用上面设置的FFLAGS值。
不过,这可以通过命令行来覆盖: demo%make"FFLAGS=–u–O" 这里,make命令行中的FFLAGS宏定义会覆盖makefile的初始值,并且会将-O标志和-u标志一起传递给f95。
注意,也可以在命令中使用"FFLAGS=",将宏重置为空字符串以使其不再有效。
make中的后缀规则 为使makefile更易编写,make将根据目标文件的后缀,使用自身的缺省规则。
缺省规则在文件/usr/share/lib/make/make.rules中。
在识别缺省的后缀规则时,make会将FFLAGS宏指定的任何标志、-c标志以及要编辑的源文件名都作为参数进行传递。
此外,make.rules文件还使用FC宏赋予的名称作为要使用的Fortran编译器的名称。
3-4Fortran编程指南•2004年4月 3.1.6 以下示例两次说明了这一规则: FC=f95OBJ=putepts.ostartupcore.oFFLAGS=–upattern:$(OBJ) f95$(OBJ)–lcore95–lcore–lsunwindow\–lpixrect–opatternpattern.o:monblockf95$(FFLAGS)–cputepts.o:monblockstartupcore.o:startupcore.f make使用缺省规则编译putepts.f和startupcore.f。
.f90文件存在缺省的后缀规则,这些规则将会调用f95编译器。
然而,除非将FC宏定义为f95,否则.f和.F文件的缺省后缀规则会调用f77而非f95。
而且,当前没有为.f95和.F95文件定义后缀规则,.modFortran95模块文件将会调用Modula编译器。
要对此进行补救,需要在调用make的目录下为make.rules文件创建您自己的本地副本,同时对该文件进行修改,添加.f95和.F95后缀规则,删除.mod的后缀规则。
有关详细信息,参见make(1S)手册页。
.KEEP_STATE与特殊依赖性检查 使用特殊目标.KEEP_STATE检查命令的依赖性及隐藏依赖性。
当.KEEP_STATE:目标有效时,make会根据状态文件检查用于生成目标的命令。
如果自上次make运行以来命令已更改,make会重新生成此目标。
当.KEEP_STATE:目标有效时,make会从cpp
(1)以及其它编译处理程序中,读取任何“隐藏”文件(如#include文件)的相应报告。
如果目标相对于这些文件中的任何文件已过期,make会重新生成它。
第3章程序开发3-
5 3.2 用SCCS进行版本跟踪和控制 SCCS代表源代码控制系统。
SCCS为实现以下目标提供了途径:■跟踪源文件的演变—即其更改历史■防止源文件被其它开发人员同时更改■通过提供版本标记来跟踪版本号 SCCS的三项基本操作是:■将文件置于SCCS控制下■签出文件进行编辑■签入文件 本部分以上一程序为例向您展示如何使用SCCS来执行这些任务。
只对基本的SCCS进行了说明,并且只介绍了三个SCCS命令:create、edit和delget。
3.2.1 用SCCS控制文件 将文件置于SCCS控制下包括以下方面:■建立SCCS目录■在文件中插入SCCSID关键字(这是可选的)■创建SCCS文件 3.2.1.1 创建SCCS目录 首先,必须在正在开发程序的目录下创建SCCS子目录。
使用以下命令:demo%mkdirSCCS SCCS必须采用大写字母。
3.2.1.2 插入SCCSID关键字 有些开发者会在每个文件中放入一个或多个SCCSID关键字,但这是可选的。
以后,每次用SCCSget或delget命令签入文件时,都会用版本号来标识这些关键字。
有三种可能的位置可以放置这些字符串: ■注释行■参数语句■初始化数据 3-6Fortran编程指南•2004年4月 使用关键字的优点是版本信息会出现在源列表和已编译的目标程序中。
如果其前面有字符串@(#),可用what命令打印目标文件中的关键字。
只含有参数和数据定义语句的已包含头文件不会生成任何初始化数据,因此这些文件的关键字通常置于注释或参数语句中。
在某些文件中,如ASCII数据文件或makefile,SCCS信息将会出现在注释中。
SCCS关键字以%keyword%形式出现,并通过SCCSget命令扩展成各自的值。
最常用的关键字有: %Z%扩展为what命令识别的标识字符串@(#)。
%M%扩展为源文件名。
%I%扩展为本SCCS维护文件的版本号。
%E%扩展为当前日期。
例如,可以用包含以下关键字的make注释来标识makefile。
# %Z%%M% %I% %E% 源文件startupcore.f、putepts.f和pattern.f可以通过以下格式的初始化数据来标识: CHARACTER*50SCCSID DATASCCSID/"%Z%%M% %I% %E%\n"/ 用SCCS处理该文件,进行编译,然后用SCCSwhat命令处理目标文件,显示如下: demo%f95-cpattern.f...demo%whatpatternpattern: pattern.f1.296/06/10 您还可以创建名为CTIME的PARAMETER,无论何时用get命令访问文件,该参数都会自动进行更新。
CHARACTER*(*)CTIMEPARAMETER(CTIME="%E%") INCLUDE文件可以用含有SCCS标记的Fortran注释加以注解:
C %Z%%M% %I% %E% 第3章程序开发3-
7 3.2.1.3 注–在Fortran95源代码文件中使用单字母派生类型组件名可能会与SCCS关键字识别产生冲突。
例如,当通过SCCS传递时,Fortran95结构组件引用X%Y%Z在执行SCCSget后会变成XZ。
当在Fortran95程序中使用SCCS时,应注意不要用单个字母定义结构组件。
例如,假如Fortran95程序中的结构引用是X%YY%
Z,SCCS并不会将%YY%解释为关键字引用。
或者,SCCSget-k选项在检索文件时将不会扩展SCCS关键字ID。
创建SCCS文件 现在,可以用SCCScreate命令将这些文件置于SCCS控制之下: demo%screatemonblockstartupcore.f\putepts.fpattern.f demo% 3.2.2 签出和签入文件 一旦源代码处于SCCS控制之下,便可用SCCS执行以下两项主要任务:签出文件以便能对其进行编辑;签入已编辑完的文件。
签出文件使用sedit命令。
例如: demo%sputepts.f 然后,SCCS会在当前目录下创建putepts.f的可写副本,并记录您的登录名。
当文件已签出时,其他用户不能再签出该文件,但可以查出是谁签出了该文件。
完成编辑后,可用sdelget命令签入已修改的文件。
例如: demo%sputepts.f 该命令会使SCCS系统做以下事情:■通过比较登录名确保您就是签出文件的用户■提示您对更改做注释■记录本次编辑会话所更改的内容■从当前目录中删除putepts.f的可写副本■用扩展了SCCS关键字的只读副本替换可写副本 3-8Fortran编程指南•2004年4月 sdelget命令是两个简单SCCS命令(delta和get)的复合命令。
delta命令执行上述列表中的前三项任务;get命令执行后两项任务。
第3章程序开发3-
9 3-10Fortran编程指南•2004年4月 第4章 4.1 库 本章介绍如何使用和创建子程序库。
对静态和动态库均进行了讨论。
认识库 软件库通常是事先已编译并组织成单个二进制库文件的子程序集。
集中的每个成员称为库元素或模块。
链接程序搜索库文件,在生成可执行二进制程序时加载用户程序所引用的目标模块。
有关详细信息,参见ld
(1)和Solaris《链接程序和库指南》。
软件库有两种基本类型:■静态库。
该库中的模块在执行前即被联编到执行文件中。
静态库通常以libname.a 命名。
.a后缀指的是归档。
■动态库。
该库中的模块可在运行时联编到可执行程序中。
动态库通常以 libname.so命名。
.so后缀指的是共享对象。
既有静态(.a)版本又有动态(.so)版本的典型系统库有:■Fortran95库:libfsu、libfui、libfai、libfai2、libfsumai、 libfprodai、libfminlai、libfmaxlai、libminvai、libmaxvai、libifai、pat■C库:libc使用库有两个优点:■对于程序调用的库例程,不需要有源代码。
■只加载所需的模块。
库文件为程序共享常用的子例程提供了一条简单途径。
只需在链接程序时给出库名便可,那些解析程序中引用的库模块将被链接并合并到可执行文件中。
4-
1 4.2 4.2.1 指定链接程序调试选项 通过LD_OPTIONS环境变量向链接程序传递其它选项,可以获得库用法和加载方面的摘要信息。
在生成目标二进制文件时,编译器会用这些选项(以及它要求的其它选项)调用链接程序。
始终建议使用编译器调用链接程序,而不是直接调用链接程序,因为许多编译器选项要求特定的链接程序选项或库引用,缺少这些,链接时会产生无法预料的结果。
示例:使用LD_OPTIONS创建加载映射: demo%setenvLD_OPTIONS’–m–Dfiles’demo%f95–omyprogmyprog.f 某些链接程序选项尚有等价的编译器命令行选项,它们可以直接在f95命令中出现。
这些选项包括–Bx、–dx、–
G、–hname、–Rpath和–ztext。
有关详细信息,参见f95
(1)手册页或《Fortran用户指南》。
在Solaris《链接程序和库指南》中,可以找到链接程序选项和环境变量的更多详细示例和解释。
生成加载映射 链接程序–m选项会生成显示库链接信息的加载映射。
可执行二进制程序生成期间链接的例程会与其来自的库一起被列出。
4-2Fortran编程指南•2004年4月 4.2.2 示例:使用–m生成加载映射: demo%setenvLD_OPTIONS’-m’demo%f95any.fany.f: MAIN:链接编辑器内存映射 输出输入区区地址 虚拟大小 .interp .hash .dynsym .dynstr .text.text.text.text.text... 100d4.interp100d4 100e8.hash100e8 103d0.dynsym103d0 10a20.dynstr10a20 10c9010c9010c9010d8410d88 1111(null)2e82e8(null)650650(null)366366(null)1e7000/opt/SUNWspro/lib/crti.of4/opt/SUNWspro/lib/crt1.o00/opt/SUNWspro/lib/values-xi.od20sparse.o 列出其它信息 其它链接程序调试功能可通过链接程序的–Dkeyword选项获得。
使用–Dhelp选项可以显示完整的列表。
示例:使用–Dhelp选项列出链接程序调试辅助选项: demo%ld–Dhelp… debug:argsdebug:bindingsdebug:detaildebug:entry …demo% 显示输入参数处理显示符号绑定;提供详细信息显示入口标准描述符 第4章库4-
3 4.2.3 例如,–Dfiles链接程序选项会列出链接过程中引用的所有文件和库: demo%setenvLD_OPTIONS’-Dfiles’demo%f95direct.fdirect.f: MAINdirect:debug:file=/opt/SUNWspro/lib/crti.o[ET_REL]debug:file=/opt/SUNWspro/lib/crt1.o[ET_REL]debug:file=/opt/SUNWspro/lib/values–xi.o[ET_REL]debug:file=direct.o[ET_REL]debug:file=/opt/SUNWspro/lib/libM77.a[archive]debug:file=/opt/SUNWspro/lib/libF77.so[ET_DYN]debug:file=/opt/SUNWspro/lib/libsunmath.a[archive] … 有关这些链接程序选项的更为详细的信息,参见《链接程序和库指南》。
编译和链接一致性 每当分步完成编译和链接时,确保编译和链接选项的一致选择是至关重要的。
用某些选项编译程序的任何部分均需要使用相同的选项进行链接。
另外,许多选项要求使用该选项编译所有源文件,包括链接步骤。
《Fortran用户指南》中的选项说明具体指出了此类选项。
示例:用-ast编译sbr.f,编译C例程,然后进行分步链接: demo%f95-c-fastsbr.fdemo%-c-fastsimm.cdemo%f95-fastsbr.osimm.o 链接步骤;将-fast传递给链接程序 4-4Fortran编程指南•2004年4月 4.3 4.3.1 4.3.1.1 4.3.1.2 4.3.2 设置库搜索路径和顺序 链接程序按某一规定顺序在若干位置搜索库。
这些位置中有一些是标准路径,有一些则取决于编译器选项-Rpath、–llibrary、–Ldir以及环境变量LD_LIBRARY_PATH。
标准库路径的搜索顺序 链接程序所用的标准库搜索路径由安装路径确定,对于静态和动态加载,它们会有所不同。
标准安装将SunStudio编译器软件置于/opt/SUNWspro/下。
静态链接 生成可执行文件时,静态链接程序按指定顺序、在以下路径(夹在其它路径中)中搜索任何可能有的库: /opt/SUNWspro/lib/s/lib//usr/lib SunStudio共享库SVr4软件的标准位置UNIX软件的标准位置 这些是链接程序所用的缺省路径。
动态链接 动态链接程序在运行时按指定顺序搜索共享库:■用户使用-Rpath指定的路径■/opt/SUNWspro/lib/■/usr/lib标准UNIX缺省值 这些搜索路径被内置于可执行文件中。
LD_LIBRARY_PATH环境变量 使用LD_LIBRARY_PATH环境变量指定链接程序应在哪些目录路径中搜索用–llibrary选项指定的库。
第4章库4-
5 可以指定多个目录,其间用冒号分隔。
通常,LD_LIBRARY_PATH变量包含两个用冒号分隔的目录列表,列表间用分号隔开: dirlist1;dirlist2 首先搜索dirlist1中的目录,接着是命令行上用任何显式–Ldir指定的目录,再接着是dirlist2以及标准目录。
也就是说,如果以任意多次的–L调用编译器,如下所示:f95...–Lpath1...–Lpathn... 则搜索顺序是:dirlist1path1...pathndirlist2standard_paths 当LD_LIBRARY_PATH变量只包含一个用冒号分隔的目录列表时,它会被解释为dirlist2。
在Solaris操作环境中,在搜索64位依赖性时,可以用相似的环境变量LD_LIBRARY_PATH_64来替代LD_LIBRARY_PATH。
有关详细信息,参见Solaris《链接程序和库指南》以及ld
(1)手册页。
■在32位SPARC处理器上,会忽略LD_LIBRARY_PATH_64。
■如果只定义了LD_LIBRARY_PATH,它将被同时用于32位和64位链接。
■如果同时定义了LD_LIBRARY_PATH和LD_LIBRARY_PATH_64,则32位链接将 用LD_LIBRARY_PATH来完成,而用LD_LIBRARY_PATH_64进行64位链接。
注–强烈建议不要对效率型软件使用LD_LIBRARY_PATH环境变量。
尽管它作为一种影响运行时链接程序搜索路径的临时机制很有用,但是任何可以引用该环境变量的动态可执行程序的搜索路径都会被改变。
您可能会看到了意想不到的结果或性能降低。
4.3.3 库搜索路径和顺序—静态链接 使用-llibrary编译器选项给出链接程序在解析外部引用时要搜索的其它库名。
例如,用选项–lmylib将库libmylib.so或libmylib.a添加到搜索列表中。
链接程序会在标准目录路径中寻找其它的libmylib库。
–L选项(和LD_LIBRARY_PATH环境变量)会创建一个路径列表,告知链接程序到哪里寻找位于标准路径以外的库。
假如libmylib.a在目录/home/proj/libs中,则选项–L/home/proj/libs会告知链接程序在生成可执行文件时到哪里寻找: demo%f95–opgrampart1.opart2.o–L/home/proj/libs–lmylib 4-6Fortran编程指南•2004年4月 4.3.3.14.3.3.2 4.3.4 4.3.4.1 4.3.4.2 –llibrary选项的命令行顺序 对于任何未解析的特殊引用,只对库进行一次搜索,并且只搜索其时在搜索中未定义的符号。
如果在命令行上列出了多个库,则会按其在命令行上出现的顺序来搜索这些库。
将–llibrary选项放置在以下位置:■将–llibrary选项置于任一.f、.for、.F、.f95或.o文件之后。
■如果调用了libx中的函数,并且这些函数引用了liby中的函数,则将–lx置于 –ly之前。
–Ldir选项的命令行顺序 –Ldir选项会将dir目录路径添加到库搜索列表中。
链接程序首先在–L选项指定的任何目录中搜索库,然后在标准目录中进行搜索。
只有将其放在它所应用的–llibrary选项之前,该选项才有用。
库搜索路径和顺序—动态链接 对于动态库,库搜索路径和加载顺序的更改与静态情况不同。
实际链接发生在运行时而不是生成时。
在生成时指定动态库 生成可执行文件时,链接程序会在可执行文件本身中记录共享库的路径。
这些搜索路径可以用–Rpath选项指定。
这一点与-Ldir选项相反,该选项在生成时指示到哪里查找-llibrary选项所指定的库,但不会将该路径记录到二进制可执行文件中。
使用dump命令可以查看创建可执行文件时内置的目录路径。
示例:列出内置于a.out之中的目录路径: demo%f95program.f-R/home/proj/libs-L/home/proj/libs-lmylib demo%dump–Lva.out|grepRPATH [5] RPATH/home/proj/libs:/opt/SUNWspro/lib 在运行时指定动态库 在运行时,链接程序会确定到哪里查找可执行文件所需的动态库:■运行时的LD_LIBRARY_PATH值■生成可执行文件时已由–R指定的路径 第4章库4-
7 4.3.4.3 如前所述,使用LD_LIBRARY_PATH能带来意想不到的副作用,因而不建议这样做。
修复动态链接期间的错误 当动态链接程序找不到所需库的位置时,它会发出以下错误消息: ld.so:prog:致命:libmylib.so:无法打开文件: 此消息指示库不在其应在的位置。
您也许在生成可执行文件时指定了共享库的路径,但这些库随后已被移动。
例如,您可能先用/my/libs/中您自己的动态库生成了a.out,而后来又将这些库移到了另一目录。
使用ldd确定可执行文件期望在哪儿找到这些库: demo%ldda.out libfui.so.1=>/opt/SUNWspro/lib/libfui.so.1 libfai.so.1=>/opt/SUNWspro/lib/libfai.so.1 libfai2.so.1=>/opt/SUNWspro/lib/libfai2.so.1 libfsumai.so.1=>/opt/SUNWspro/lib/libfsumai.so.1 libfprodai.so.1=>/opt/SUNWspro/lib/libfprodai.so.1 libfminlai.so.1=>/opt/SUNWspro/lib/libfminlai.so.1 libfmaxlai.so.1=>/opt/SUNWspro/lib/libfmaxlai.so.1 libfminvai.so.1=>/opt/SUNWspro/lib/libfminvai.so.1 libfmaxvai.so.1=>/opt/SUNWspro/lib/libfmaxvai.so.1 libfsu.so.1=>/opt/SUNWspro/lib/libfsu.so.1 libsunmath.so.1=>/opt/SUNWspro/lib/libsunmath.so.1 libm.so.1=> /usr/lib/libm.so.1 libc.so.1=> /usr/lib/libc.so.1 libdl.so.1=>/usr/lib/libdl.so.1 /usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1 如果可能的话,将这些库移动或复制到正确的目录中,或者在链接程序搜索的目录中建
立到该目录的软链接(使用ln-s)。
或者,也可能是没有正确设置LD_LIBRARY_PATH。
检查LD_LIBRARY_PATH是否包含运行时所需库的路径。
4-8Fortran编程指南•2004年4月 4.4 4.4.1 创建静态库 静态库文件是使用ar
(1)公用程序由预编译的目标文件(o文件)生成的。
链接程序从库中提取在当前链接的程序内引用了其入口点的任何元素,如子程序、入口名或BLOCKDATA子程序中已初始化的COMMON块。
这些提取出来的元素(例程)会被永久联编到链接程序生成的a.out可执行文件中。
权衡静态库 与动态情况相比,关于静态库和链接,有三个主要问题需要谨记:■静态库更加自主,但适应能力较差。
如果以静态方式联编a.out可执行文件,它所需的库例程会变成可执行二进制文件的一部分。
但是,如果需要更新联编到a.out可执行文件中的静态库例程,则必须重新链接并重新生成整个a.out文件以利用已更新的库。
对于动态库,库并不是a.out文件的一部分,并且链接是在运行时完成的。
要利用已更新的动态库,只需将新库安装在系统中即可。
■静态库中的“元素”是单独的编译单元,即.o文件。
由于单个编译单元(源文件)可以包含多个子程序,因此这些例程在一起编译时会变成静态库中的单一模块。
这就意味着会将编译单元中的所有例程一起装入a.out可执行文件中,即使实际只调用了那些子程序中的一个。
通过优化库例程分发到可编译源文件中的方式,可以改善这种情况。
(尽管如此,只有程序实际引用的那些库模块才会被装入可执行文件。
)■链接静态库时,顺序很重要。
链接程序按输入文件在命令行上出现的顺序对其进行处理—从左至右。
当链接程序决定是否从库中加载某一元素时,其决定取决于它已经处理的库元素。
该顺序不仅依赖于元素在库文件中的出现顺序,而且还依赖于编译命令行中指定库的顺序。
示例:如果Fortran程序在两个文件(main.f和crunch.f)中,并且只有后者访问某个库,则在crunch.f或crunch.o之前引用该库是错误的: demo%f95main.f–lmylibrarycrunch.f–omyprog(不正确) demo%f95main.fcrunch.f–lmylibrary–omyprog(正确) 第4章库4-
9 4.4.2 简单静态库的创建 假设您可以将程序中的所有例程分布在一组源文件中,同时假定这些文件全部包含在子目录test_lib/中。
进一步假定这些文件是以这样一种方式组织的:它们每一个都只包含一个用户程序将会调用的主要子程序,同时还包含该子程序可能会调用的任何“帮助程序”例程,但这些例程不会从库中的任何其它例程中调用。
另外,从一个以上库例程中调用的任何帮助程序例程均被集合到单个源文件中。
这样就给出了一个组织得非常合理的源文件及目标文件集。
假定每个源文件的名称均取自文件中第一个例程的名称,在多数情况下,该例程是库中的主要文件之一: demo%cdtest_lib demo%ls 总数14 2dropx.f 2delte.f 2etc.f 2evalx.f2linkz.f 2markx.f2point.f 更低级的“帮助程序”例程被集合到文件etc.f中。
其它文件可以包含一个或多个子程序。
首先,使用–c选项编译每一个库源文件,生成相应的可重定位的.o文件: demo%f95–c*.f demo%ls 总数42 2dropx.f 4etc.o 2delte.f 4dropx.o 4delte.o 2etc.f demo% 2linkz.f2evalx.f4evalx.o 4markx.o4linkz.o2markx.f 2point.f4point.o 现在,使用ar创建静态库testlib.a:demo%arcrtestlib.a*.o 4-10Fortran编程指南•2004年4月 4.4.2.1 要使用该库,或者在编译命令中包括此库文件,或者使用–l和–L编译选项。
以下示例直接使用.a文件: demo%cattrylib.fCprogramtotesttestlibroutines x=21.998callevalx(x)callpoint(x)print*,'value',xenddemo%f95–otrylibtrylib.ftest_lib/testlib.ademo% 注意,主程序只调用库中的两个例程。
您可以验证并未将库中未调用的例程装入可执行文件,方法是查找用nm显示的可执行文件的名称列表中是否有这些例程。
demo%nmtrylib|grepFUNC|greppoint [146] | 70016| 152|FUNC|GLOB|0|
8 demo%nmtrylib|grepFUNC|grepevalx [165] | 69848| 152|FUNC|GLOB|0|
8 demo%nmtrylib|grepFUNC|grepdelte demo%nmtrylib|grepFUNC|grepmarkxdemo%..etc |point_|evalx_ 在上述示例中,grep只在名称列表中查找与实际调用的那些库例程相应的项。
引用库的另一方法是通过–llibrary和–Lpath选项。
这里,必须更改库的名称以符合libname.a惯例: demo%mvtest_lib/testlib.atest_lib/libtestlib.ademo%f95–otrylibtrylib.f–Ltest_lib–ltestlib –llibrary和–Lpath选项与安装在系统可公共访问目录(如/usr/local/lib)中的库一起使用,以便其他用户可以引用它。
例如,假如将libtestlib.a留在/usr/local/lib中,可以通知其他用户使用以下命令编译: demo%f95–omyprogmyprog.f–L/usr/local/lib–ltestlib 静态库中的替换 如果仅有几个元素需要重新编译,没有必要重新编译整个库。
ar的–r选项允许替换静态库中的个别元素。
第4章库4-11 4.4.2.2 示例:重新编译并替换静态库中的单个例程:demo%f95–cpoint.fdemo%ar-rtestlib.apoint.o 对静态库中的例程进行排序 要在ar正在生成静态库时对其中的元素进行排序,请使用命令lorder
(1)和tsort
(1): demo%ar-crmylib.a'lorderexg.ofofx.odiffz.o|tsort' 4-12Fortran编程指南•2004年4月 4.5 4.5.1 创建动态库 动态库文件是由链接程序ld自预编译目标模块生成的,这些模块可在执行开始后联编到可执行文件中。
动态库的另一功能是模块可以为系统中其它正在执行的程序使用,而无需在每个程序的内存中复制模块。
鉴于此原因,动态库也是共享库。
动态库提供下列功能:■链接程序在编译链接过程中并不将目标模块联编到可执行文件中;此种联编被推迟 到了运行时。
■共享库模块在第一个运行程序引用它时联编到系统内存中。
如果有任何后续运行程 序引用它,会将该引用映射到上述第一个副本。
■使用动态库,程序维护变得更加容易。
一旦在系统中安装了已更新的动态库,无需 重新链接可执行文件便会立即影响使用它的所有应用程序。
权衡动态库 动态库引入了其它一些权衡考虑因素:■a.out文件更小 将库例程联编推迟到运行时意味着可执行文件的大小要小于同等意义上调用库静态版本的可执行文件;该可执行文件不包含库例程的二进制文件。
■进程占用的内存可能更少当使用库的若干进程同时处于活动状态时,仅有库的一个副本驻留在内存中,为所有进程所共享。
■有可能增加系统开销运行时加载和链接编辑库例程需要额外的处理器时间。
另外,库中与位置无关的编码可能要比静态库中可重定位的编码执行得更慢。
■有可能提高系统总体性能提高库共享可减少内存占用,其结果将会改善系统的总体性能(减少了内存交换时的I/O访问时间)。
各程序间的性能特征随程序的不同会有很大变化。
并非总能预先判断或估计动态库与静态库相比性能会提高(还是降低)。
但是,如果所需库的这两种形式对您都可用,则分别评估一下程序使用每个库时的性能还是很值得的。
第4章库4-13 4.5.2 4.5.3 4.5.3.14.5.3.24.5.3.3 位置无关代码和–xcode 可以将与位置无关的代码(PIC)联编到程序中的任何地址,而无需由链接编辑器进行重定位。
从固有性质出发,此类代码可以在同时发生的进程间共享。
因而,如果要生成动态共享库,必须使用-xcode编译器选项将组成例程编译成与位置无关的。
在与位置无关的代码中,对全局项的每一引用均会通过全局偏移表中的指针编译为某一引用。
每个函数调用均会通过过程链接表以相对编址模式进行编译。
在SPARC处理器上,全局偏移表的大小限制为8K字节。
编译器标志-xcode=v用于指定二进制对象的代码地址空间。
使用该标志,不但可以生成32、44或64位绝对地址,而且可生成大小不同模型与位置无关的代码。
(xcode=pic13等价于传统的-pic标志,-xcode=pic32等价于-PIC。
)–xcode=pic32编译器选项与–xcode=pic13类似,但允许全局偏移表跨越32位地址范围。
有关详细信息,参见f95
(1)手册页或《Fortran用户指南》。
联编选项 可以在编译时指定动态或静态库联编。
这些选项实际上是链接程序选项,但它们是由编译器识别并传递给链接程序的。
–Bdynamic|–Bstatic –Bdynamic用于在各种可能的情况下为共享动态联编设置首选项。
–Bstatic将联编只限制于静态库。
当库的静态和动态版本都可用时,使用该选项在命令行首选项间进行切换: f95prog.f–Bdynamic–lwells–Bstatic–lsurface –dy|–dn 允许或不允许对整个可执行文件进行动态链接。
(该选项只能在命令行上出现一次。
)–dy允许链接动态共享库。
–dn不允许链接动态库。
64位环境中的联编 某些静态系统库(如libm.a和libc.a)不可以在64位Solaris操作环境中使用。
这些库只作为动态库提供。
在这些环境中使用-dn将会导致错误,指示缺少某些静态系统库。
另外,如果编译器命令行以-Bstatic结尾,其结果将是一样的。
4-14Fortran编程指南•2004年4月 4.5.44.5.5 要与特定库的静态版本进行链接,请使用类似下面的命令行:f95-oprogprog.f-Bstatic-labc-lxyz-Bdynamic 在此,链接的是用户的libabc.a和libxyz.a文件(而不是libabc.so或libxyz.so),最后的-Bdynamic确保以动态方式链接包括系统库在内的其余各库。
在更复杂的情况下,可能必须在链接阶段根据需要用相应的-Bstatic或-Bdynamic显式引用每个系统库和用户库。
首先使用设置为’-Dfiles’的LD_OPTIONS获得全部所需库的列表。
然后用-nolib执行链接步骤(禁止自动链接系统库)并显式引用所需的库。
例如: f95-xarch=v9-ocdf-nolibcdf.o-Bstatic-lsunmath\-Bdynamic-lm-lc 命名惯例 为符合链接加载程序和编译器假定的动态库命名惯例,请为您使用前缀lib和后缀.so创建的动态库命名。
例如,编译器选项–lmyfavs可以引用libmyfavs.so。
链接程序还接受可选的版本号后缀:例如,libmyfavs.so.1代表库的第一版。
编译器的–hname选项将name记录为正在生成的动态库的名称。
一个简单动态库 生成动态库需要用–xcode选项和链接程序选项–
G、–ztext和–hname编译源文件。
这些链接程序选项可通过编译器命令行来提供。
您可以用静态库示例中使用的相同文件创建一个动态库。
示例:用–pic和其它链接程序选项编译: demo%f95–olibtestlib.so.1–G–xcode=pic13–ztext\–hlibtestlib.so.1*.f –G告知链接程序生成一个动态库。
–ztext会在发现与位置无关的代码以外的任何内容(如可重定位文本)时发出警告。
第4章库4-15 4.5.6 示例:使用动态库生成可执行文件a.out: demo%f95–otrylib-R‘pwd‘trylib.flibtestlib.so.1demo%filetrylibtrylib:ELF32位MSB可执行SPARC版本
1,已动态链接,未剥离demo%lddtrylib libtestlib.so.1=>/export/home/U/Tests/libtestlib.so.1libfui.so.1=>/opt/SUNWspro/lib/libfui.so.1libfai.so.1=>/opt/SUNWspro/lib/libfai.so.1libc.so.1=>/usr/lib/libc.so.1 注意,此示例使用-R选项将动态库路径(当前目录)联编到可执行文件中。
file命令显示可执行文件是以动态方式链接的。
初始化公共块 生成动态库时,通过将已初始化的公共块集合到同一库中并在其它所有库之前引用该库,确保正确初始化公共块(用DATA或BLOCKDATA表示的块)。
例如: demo%f95-G-xcode=pic32-oinit.soblkdat1.fblkdat2.fblkdat3.fdemo%f95-oprogmain.finit.sootherlib1.sootherlib2.so 首次编译会由定义公共块并在BLOCKDATA单元中对其进行初始化的文件创建一个动态库。
第二次编译创建可执行二进制文件,将已编译的主程序与应用程序所需的动态库链接起来。
注意,初始化所有公共块的动态库在其它所有库之前首先出现。
这样将确保正确地初始化这些块。
4-16Fortran编程指南•2004年4月 4.64.7 随SunFortran编译器提供的库 下表展示了随编译器一同安装的库。
表4-
1 随编译器提供的主要库 库 f95内在支持f95接口f95数组内在库f95区间运算内在库Sun数学函数库 名称 libfsulibfuilibf*ailibifailibsunmath 所需选项 无无无-xinterval无 可发送库 如果您的可执行文件使用了runtime.libraries自述文件中列出的某个Sun动态库,则您的许可证包括将该库重新分发给客户的权利。
该自述文件位于READMEs目录:/opt/SUNWspro/READMEs/ 请勿以任何形式重新分发或透露头文件、源代码、目标模块或目标模块的静态库。
有关更多详细信息,请参阅您的软件许可证。
第4章库4-17 4-18Fortran编程指南•2004年4月 第5章 程序分析和调试 本章介绍了许多有利于程序分析和调试的编译器功能。
5.1 5.1.1 全局程序检查(-Xlist) –Xlist选项为分析源程序中的不一致性及可能存在的运行时问题提供了一条颇有价值的途径。
编译器执行的分析是全局性的,跨越各个子程序。
–Xlist报告子程序变量、公共块、参数在对齐、数值与类型一致性方面的错误,以及其它各种错误。
-Xlist还可用来生成详细的源代码列表和交叉引用表。
用-Xlist选项编译的程序会自动将其分析数据内置于二进制文件中。
这样便能对库中的程序执行全局程序检查。
GPC概述 全局程序检查(GPC)(由-Xlistx选项调用)执行下列任务:■比通常更为严格地强制执行Fortran类型检查规则,特别是在单独编译的例程之间■强制执行在不同机器或操作系统之间转移程序所需的一些可移植性限制■检测仍有可能未达到最佳或易于出错的合法构造■揭示其它潜在的错误和含混不清之处特别地,全局检查会报告如下问题:■接口问题 ■伪参数和实参数的数量与类型间的冲突 5-
1 5.1.2 5.1.2.1 ■函数值的错误类型■因不同子程序间公共块中的数据类型不匹配而引起的可能冲突■使用问题■用作子例程的函数或用作函数的子例程■已声明但未使用的函数、子例程、变量以及标签■已引用但未声明的函数、子例程、变量以及标签■未设置变量的使用■执行不到的语句■隐式类型变量■已命名公共块的长度、名称和布局的不一致性 如何调用全局程序检查 命令行中的-Xlist选项用于调用编译器的全局程序分析器。
该选项有许多子选项,分别在以下各部分进行说明。
示例:为基本全局程序检查编译以下三个文件: demo%f95–Xlistany1.fany2.fany3.f 在上述示例中,编译器:■在文件any1.lst中产生输出列表■在无错误时编译并链接程序 屏幕输出 通常会将-Xlistx产生的输出列表写到文件中。
要直接显示到屏幕上,请使用-Xlisto将输出文件写到/dev/tty。
示例:显示到终端: demo%f95–Xlisto/dev/ttyany1.f 5.1.2.2 缺省输出功能 -Xlist选项提供了可用于输出的功能组合。
不使用其它-Xlist选项,缺省情况下会获得以下结果:■列表文件名取自出现的第一个输入源文件或目标文件,同时扩展名代之以.lst■编有行号的源码列表 5-2Fortran编程指南•2004年4月 5.1.2.3 ■描述例程间不一致性的错误消息(嵌入在列表中)■标识符的交叉引用表■以每页66行、每行79列编页码■无调用图■不扩展include文件 文件类型 检查进程可识别编译器命令行中以.f、.f90、.f95、.for、.F、.F95或.o结尾的所有文件。
.o文件仅向进程提供与全局名称(如子例程和函数名)有关的信息。
第5章程序分析和调试5-
3 5.1.3 -Xlist和全局程序检查的一些示例 此处列出了下列示例中使用的Repeat.f源代码: demo% catRepeat.fPROGRAMrepeatpn1=27.005CALLsubr1(pn1)CALLnewf(pn1)PRINT*,pn1END SUBROUTINEsubr1(x)IF(x.GT.1.0)THENCALLsubr2(x*0.5)ENDIF END SUBROUTINEnewf(ix)INTEGERPRNOKIF(ix.eq.0)THENix=-1ENDIFPRINT*,prnok(ix) END INTEGERFUNCTIONprnok(x)prnok=INT(x)+.05 END SUBROUTINEunreach_sub()CALLsleep
(1) END SUBROUTINEsubr2(x)CALLsubr1(x+x) END 5-4Fortran编程指南•2004年4月 示例:使用-XlistX显示错误、警告和交叉引用 demo%f95-XlistXRepeat.f demo%catRepeat.lst Repeat.f 2002年3月18日星期一18:08:27 第1页 文件"Repeat.f"程序repeat
4 CALLnewf(pn1) ^ ****ERR#418:参数"pn1"是real,但伪参数是integer参见:"Repeat.f"第14行
5 PRINT*,pn1 ^ ****ERR#570:变量"pn1"作为real引用但在下行被设置为第4行 子例程newf 19 PRINT*,prnok(ix) ^ ****ERR#418:参数"ix"是integer,但伪参数是real参见:"Repeat.f"第22行 函数prnok 23 prnok=INT(x)+.05 ^ ****WAR#1024:"real*4"类型的值赋值给"integer*4"类型的变量是可疑的 子例程unreach_sub 26 SUBROUTINEunreach_sub() ^ ****WAR#338:子例程"unreach_sub"从未自程序中调用子例程subr2 31 CALLsubr1(x+x) ^ ****WAR #348:"subr1"的递归调用。
请参阅动态调用:"Repeat.f"第10行"Repeat.f"第3行 integer 交叉引用 2002年3月18日星期一18:08:27第2页 交叉引用表源文件:Repeat.f 第5章程序分析和调试5-
5 图例:DUMACIENL 定义/声明简单使用修改的事件实际参数子例程/函数调用初始化:数据或扩展声明EQUIVALENCE中事件NAMELIST中事件使用模块 交叉引用程序形式 程序------- repeat交叉引用 2002年3月18日星期一15:40:57 第3页
D 1:
D 2002年3月18日星期一15:40:57 第4页 函数和子例程------------------------- INT 固有
C newf
C
D prnokint*4
DC
DM
sleep
subr1
C
D
C subr2
C
D unreach_sub
23:C
4:C
14:D 15:D22:
D C 3:C8:D31:C 10:C30:
D D 19:C23:M27:C 26:
D 5-6Fortran编程指南•2004年4月 交叉引用 2002年3月18日星期一15:40:57第5页 变量和数组-------------------- ix int*4伪参数
DUMA
14:
D 16:
U 17:
M 19:
A pn1 real*4
UMA
2:
M 3:
A 4:
A 5:
U x real*4伪参数
DU
8:
D 9:
U 10:
U DU 30:
D 31:
U 31:
U DA 22:
D 23:
A ------------------------------------------------------------------- 统计 2002
年3月18日星期一15:40:57第6页 日期:选项:文件:行:例程:消息: 2002年3月18日星期一15:40:57 -XlistX2(源:1;库:1) 33(源:33;库子程序:1)6(MAIN:1;子例程:4;函数:1)6(错误:3;警告:3) 5.1.4 5.1.4.1 跨例程全局检查的子选项 基本的全局交叉检查选项是不带子选项的-Xlist。
它是子选项的组合,其中的每一项都可以单独指定。
以下部分介绍用于产生列表、错误或交叉引用表的选项。
命令行中可以出现多个子选项。
子选项语法 按下列规则添加子选项:■将子选项添加到-Xlist的末尾。
■不要在-Xlist和子选项间置入空格。
第5章程序分析和调试5-
7 5.1.4.2 ■每个-Xlist只使用一个子选项。
-Xlist及其子选项 按下列规则合并子选项:■最常用的选项是-Xlist(列表、错误、交叉引用表)。
■使用-Xlistc、-XlistE、-XlistL或-XlistX可以合并特定的功能。
■其它子选项进一步指定其它细节。
示例:以下两个命令行中的每一个执行相同的任务: demo%f95–Xlistc–Xlistany.f demo%f95-Xlistcany.f 下表展示单独由这些基本的-Xlist子选项生成的报告: 表5-
1 基本的Xlist子选项 生成的报告 错误、列表、交叉引用仅错误仅错误以及源码列表仅错误以及交叉引用表仅错误以及调用图 选项 –Xlist–XlistE–XlistL–XlistX–Xlistc 5-8Fortran编程指南•2004年4月 下表展示所有-Xlist子选项。
表5-
2 -Xlist子选项的完整列表 选项 -Xlist(无子选项)-Xlistc -XlistE-Xlisterr[nnn]-Xlistf-Xlisth-XlistI -XlistL-Xlistln 操作 显示错误、列表和交叉引用表 显示调用图和错误单独使用时,-Xlistc不显示列表或交叉引用。
它使用可打印字符以树的形式产生调用图。
如果某些子例程未自MAIN中调用,会显示一个以上的图。
单独打印每一个BLOCKDATA,不连接到MAIN。
缺省时不显示调用图。
显示错误单独使用时,-XlistE只显示跨例程错误而不显示列表或交叉引用。
在检验报告中禁止错误nnn可使用-Xlisterr禁止来自列表或交叉引用的编号错误信息。
例如:-Xlisterr338禁止错误消息338。
要禁止其它特定的错误,可重复使用该选项。
如果未指定nnn,会禁止所有错误消息。
更快地产生输出可使用-Xlistf产生源文件列表和交叉检查报告,并在未完全编译的情况下检查源码。
显示来自交叉检查停止编译的错误使用-Xlisth,如果在交叉检查程序时检测到错误,编译将会停止。
此时,会将报告重定向到stdout而非*.lst文件。
列表和交叉检查include文件如果-XlistI是唯一使用的子选项,会随-Xlist标准输出(行编号列表、错误消息和交叉引用表)一同显示或扫描include文件。
列表—如果未禁止列表,则会在适当位置列出include文件。
文件会按其被包含的次数列出。
这些文件是:源文件、#include文件、INCLUDE文件交叉引用表—如果未禁止交叉引用表,会在生成交叉引用表时扫描下列所有文件:源文件、#include文件、INCLUDE文件缺省时不显示include文件。
显示列表和错误使用-XlistL仅产生列表和跨例程错误列表。
该子选项本身并不显示交叉引用表。
缺省时显示列表和交叉引用表 设置分页符可使用-Xlistl将页长度设置为缺省页面大小以外的值。
例如,-Xlistl45将页长度设置为45行。
缺省值是66。
如果令n=0(-Xlistl0),该选项将显示不带分页符的列表和交叉引用,以便于屏幕查看。
第5章程序分析和调试5-
9 表5-
2 -Xlist子选项的完整列表(续下) 选项 -XlistMP-Xlistoname-Xlistsn -Xlistw[nnn]-Xlistwar[nnn]-XlistX 操作 检查OpenMP指令的一致性可使用-XlistMP报告源代码文件中指定的OpenMP指令的不一致性。
有关详细信息,另请参见《OpenMPAPI用户指南》。
指定-Xlist输出报告文件可使用-Xlisto指定生成的报告输出文件。
(在o和name之间必须有一个空格。
)使用-Xlistoname,将会输出到name而不是file.lst。
要直接显示到屏幕上,请使用以下选项:-Xlisto/dev/tty 禁止交叉引用中未引用的符号可使用-Xlists在交叉引用表中禁止include文件中已定义但源文件中未引用的任何标识符。
如果使用了子选项-XlistI,该子选项将不起作用。
缺省时不显示
U.S.A.保留所有权利。
美国政府权利-商业软件。
政府用户应遵守SunMicrosystems,Inc.标准许可证协议和FAR及其补充材料的适用规定。
使用须服从许可证条款。
本发行物可能包含第三方开发的材料。
本产品的某些部分可能是从BerkeleyBSD系统衍生出来的,并获得了加利福尼亚大学的许可。
UNIX是由X/OpenCompany,Ltd.在美国和其它国家/地区独家许可的注册商标。
Sun、SunMicrosystems、Sun徽标、Java和JavaHelp是SunMicrosystems,Inc.在美国和其它国家/地区的商标或注册商标。
所有SPARC商标的使用均已获得许可,它们是SPARCInternational,Inc.在美国和其它国家/地区的商标或注册商标。
标有SPARC商标的产品都基于由SunMicrosystems,Inc.开发的体系结构。
本产品受“美国出口控制”法律的保护和控制,而且还可能服从其它国家/地区的进出口法律。
严禁将其直接或间接地最终用于核、导弹、生化武器或海上核领域,严禁这些领域的最终用户使用。
严禁将其出口或再出口到美国禁运区或美国出口排除名单中指明的实体,包括但不限于被拒绝的个人和特别指定的国家名单。
本文档按“原样”提供,对所有明示或默示的条件、陈述和担保,包括对适销性、特殊用途的适用性或非侵权性的默示保证,均不承担任何责任,除非此免责声明的适用范围在法律上无效。
请回收 目录 开始之前xiii印刷惯例xiiiShell提示符xv访问SunStudio软件和手册页xv访问编译器和工具文档xvii访问Solaris相关文档xx开发人员资源xxi联系Sun技术支持xxi发送意见xxi
1.简介1–11.1标准一致性1–11.2Fortran95编译器的功能1–21.3其它Fortran公用程序1–21.4调试公用程序1–31.5SunPerformanceLibrary1–31.6区间运算1–31.7手册页1–41.8自述文件1–51.9命令行帮助1–6 iii
2.Fortran输入/输出2–12.1从Fortran程序内部访问文件2–12.1.1访问命名文件2–12.1.2不用文件名打开文件2–32.1.3不用OPEN语句打开文件2–42.1.4向程序传递文件名2–52.2直接I/O2–72.3二进制I/O2–82.4I/O流2–92.5内部文件2–112.6其它I/O注意事项2–13
3.程序开发3–13.1使用make公用程序简化程序构建3–13.1.1Makefile3–13.1.2make命令3–33.1.3宏3–33.1.4覆盖宏值3–43.1.5make中的后缀规则3–43.1.6.KEEP_STATE与特殊依赖性检查3–53.2用SCCS进行版本跟踪和控制3–63.2.1用SCCS控制文件3–63.2.2签出和签入文件3–8
4.库4–14.1认识库4–14.2指定链接程序调试选项4–24.2.1生成加载映射4–24.2.2列出其它信息4–3 ivFortran编程指南•2004年4月 4.2.3编译和链接一致性4–44.3设置库搜索路径和顺序4–5 4.3.1标准库路径的搜索顺序4–54.3.2LD_LIBRARY_PATH环境变量4–54.3.3库搜索路径和顺序—静态链接4–64.3.4库搜索路径和顺序—动态链接4–74.4创建静态库4–94.4.1权衡静态库4–94.4.2简单静态库的创建4–104.5创建动态库4–134.5.1权衡动态库4–134.5.2位置无关代码和–xcode4–144.5.3联编选项4–144.5.4命名惯例4–154.5.5一个简单动态库4–154.5.6初始化公共块4–164.6随SunFortran编译器提供的库4–174.7可发送库4–17
5.程序分析和调试5–15.1全局程序检查(-Xlist)5–15.1.1GPC概述5–15.1.2如何调用全局程序检查5–25.1.3-Xlist和全局程序检查的一些示例5–45.1.4跨例程全局检查的子选项5–75.2特殊编译器选项5–115.2.1下标边界(–C)5–115.2.2未声明的变量类型(–u)5–115.2.3编译器版本检查(–V)5–12 目录v 5.3使用dbx调试5–12
6.浮点运算6–16.1简介6–16.2IEEE浮点运算6–26.2.1–trap=编译器选项6–36.2.2浮点异常6–36.2.3处理异常6–46.2.4捕获浮点异常6–46.2.5非标准运算6–46.3IEEE例程6–66.3.1标志和ieee_flags()6–66.3.2IEEE极值函数6–96.3.3异常处理程序和ieee_handler()6–106.4调试IEEE异常6–166.5更深层次的数值风险6–186.5.1避免简单下溢6–186.5.2以错误答案继续6–196.5.3过度下溢6–196.6区间运算6–21
7.移植7–17.1回车控制7–17.2使用文件7–27.3从科学大型机移植7–27.4数据表示7–37.5霍尔瑞斯数据7–47.6非标准编码措施7–67.6.1未初始化的变量7–6 viFortran编程指南•2004年4月 7.6.2别名使用和-xalias选项7–67.6.3模糊优化7–137.7时间和日期函数7–157.8疑难解答7–187.8.1结果贴近,但不够贴近7–187.8.2程序失败而不警告7–19
8.性能剖析8–18.1SunStudio性能分析器8–18.2time命令8–38.2.1time输出的多处理器解释8–38.3tcov剖析命令8–48.3.1增强的tcov分析8–4
9.性能与优化9–19.1编译器选项的选择9–29.1.1性能选项9–39.1.2其它性能策略9–99.1.3使用已优化的库9–99.1.4消除性能抑制因素9–99.1.5查看编译器注释9–129.2进阶读物9–13 10.并行化10–110.1基本概念10–110.1.1加速—期望目标10–210.1.2程序并行化步骤10–310.1.3数据依赖问题10–410.1.4编译以实现并行化10–610.1.5线程数10–
7 目录vii 10.1.6栈、栈大小和并行化10–710.2自动并行化10–9 10.2.1循环并行化10–910.2.2数组、标量和纯标量10–1010.2.3自动并行化标准10–1010.2.4具有约简操作的自动并行化10–1210.3显式并行化10–1410.3.1可并行化的循环10–1510.3.2OpenMP并行化指令10–2010.3.3Sun风格的并行化指令10–2110.3.4Cray风格的并行化指令10–3210.4环境变量10–3510.4.1PARALLEL和OMP_NUM_THREADS10–3510.4.2SUNW_MP_WARN10–3510.4.3SUNW_MP_THR_IDLE10–3510.5调试并行化程序10–3710.5.1调试时的首要步骤10–3810.5.2使用dbx调试并行代码10–3910.6进阶读物10–41 11.C-Fortran接口11–111.1兼容性问题11–111.1.1函数还是子例程?11–211.1.2数据类型的兼容性11–211.1.3大小写敏感性11–411.1.4例程名中的下划线11–411.1.5按引用或值传递参数11–511.1.6参数顺序11–511.1.7数组索引和顺序11–5 viiiFortran编程指南•2004年4月 11.1.8文件描述符和stdio11–611.1.9库与使用f95命令链接11–711.2Fortran初始化例程11–811.3按引用传递数据参数11–911.3.1简单数据类型11–911.3.2COMPLEX数据11–1011.3.3字符串11–1111.3.4一维数组11–1211.3.5二维数组11–1311.3.6结构11–1411.3.7指针11–1611.4按值传递数据参数11–1911.5返回值的函数11–2111.5.1返回简单数据类型11–2111.5.2返回COMPLEX数据11–2211.5.3返回CHARACTER串11–2411.6带标号的COMMON11–2511.7在Fortran与C之间共享I/O11–2611.8交替返回11–2711.9Fortran2000与C的互操作性11–28索引索引–
1 目录ix xFortran编程指南•2004年4月 表 表1-1表2-1表4-1表5-1表5-2表6-1表6-2表6-3表6-4表7-1表7-2表7-3表7-4表9-1表10-1表10-2表10-3表10-4表10-5表10-
6 需要关注的自述文件1–5csh/sh/ksh命令行重定向和管道2–6随编译器提供的主要库4–17基本的Xlist子选项5–8-Xlist子选项的完整列表5–9ieee_flags(action,mode,in,out)的参数值6–7ieee_flagsin、out参数的含意6–7返回IEEE值的函数6–10ieee_handler(action,exception,handler)的参数数据类型的最大字符数7–4-xalias关键字及其含意7–7Fortran时间函数7–15摘要:非标准VMSFortran系统例程7–17一些有效性能选项9–3并行化选项10–6识别的约简操作10–13显式并行化问题10–17DOALL限定符10–24DOALLSCHEDTYPE限定符10–28DOALL限定符(Cray风格)10–33 6–11 xi 表10-7表11-1表11-2表11-3表11-4表11-5表11-6表11-7表11-8表11-9表11-10表11-11表11-12表11-13表11-14表11-15表11-16表11-17 DOALLCray调度10–34数据大小与对齐—(以字节为单位)按引用传递(f95和)11–3Fortran与C之间的I/O比较11–7传递简单数据类型11–9传递COMPLEX数据类型11–10传递CHARACTER串11–11传递一维数组11–12传递二维数组11–13传递传统FORTRAN77STRUCTURE记录11–14传递Fortran95派生类型11–15传递FORTRAN77(Cray)POINTER11–16在C与Fortran95之间传递简单数据元素11–19返回REAL或Float值的函数11–21返回COMPLEX数据的函数(SPARCV8)11–22返回COMPLEX数据的函数(SPARCV9)11–23返回CHARACTER串的函数11–24模拟带标号的COMMON11–25交替返回11–27 xiiFortran编程指南•2004年4月 开始之前 《Fortran编程指南》提供了有关Sun™StudioFortran95编译器f95的基本信息。
其中介绍了Fortran95的输入/输出、程序开发、库、程序分析与调试、数值精度、移植、性能、优化、并行化以及互操作性。
本指南专供科学工作者、工程技术人员以及具有Fortran语言的应用知识并希望了解如何有效使用Fortran编译器的程序员使用。
另外,我们还假设您大体熟悉Solaris™操作环境或UNIX®。
有关f95编译器环境和命令行选项方面的信息,另请参见手册《Fortran用户指南》。
印刷惯例 表P-
1 字样惯例 字样 AaBbCc123 含义 命令、文件及目录的名称;计算机屏幕输出 示例 编辑.login文件。
使用ls-a列出所有文件。
%Youhavemail. xiii 表P-
1 字样惯例 字样 AaBbCc123 AaBbCc123 含义 键入的内容,用于与计算机屏幕输出相对比 书名、新词或术语、要强调的词语 AaBbCc123 命令行占位文字;用实际名称或值替换 示例 %suPassword: 参阅《用户指南》第6章。
这些称为类选项。
您必须是超级用户才能执行此项操作。
要删除文件,请键入rmfilename。
■符号∆代表空格,此处的空格是有意义的: ∆∆36.001 ■FORTRAN77标准采用了较早的惯例,名称“FORTRAN”用大写字母拼写。
当前的惯例是使用小写字母:“Fortran95” ■对联机手册页的引用以主题名加部分号形式出现。
例如,对库例程GETENV的引用将显示为getenv(3F),这意味着访问该手册页的man命令将是:man-s3Fgetenv。
表P-2代码符号 []{} | : … 代码惯例 含义 方括号中的参数为可选参数。
大括号中包含必需选项的选择集。
“管道”或“竖线”符号用于分隔参数,只能选择其中之
一。
与逗号类似,冒号有时用于分隔参数。
省略号指略去了一个系列项中的某些项。
表示法 O[n]d{y|n} B{dynamic|static}Rdir[:dir]xinline=f1[,…fn] 代码示例 -O4、O-dy -Bstatic -R/local/libs:/U/a -xinline=alpha,dos xivFortran编程指南•2004年4月 Shell提示符 Shell CshellCshell超级用户Bourneshell和KornshellBourneshell和Kornshell的超级用户 提示符 machine-name%machine-name#$ # 访问SunStudio软件和手册页 编译器和工具及它们的手册页并未安装到标准的/usr/bin/和/usr/share/man目录中。
要访问这些编译器和工具,必须正确设置PATH环境变量(参见第xv页中的“访问编译器和工具”)。
要访问手册页,必须正确设置MANPATH环境变量(参见第xvi页中的“访问手册页”)。
有关PATH变量的详细信息,参见csh
(1)、sh
(1)和ksh
(1)手册页。
有关MANPATH变量的详细信息,参见man
(1)手册页。
有关设置PATH变量和MANPATH变量以访问本版本的详细信息,参见安装指南或咨询系统管理员。
注意–本部分中的信息假定您的SunStudio编译器和工具安装在/opt目录中。
如果软件未安装在/opt目录中,请向系统管理员询问您系统中的相当路径。
访问编译器和工具 采用以下步骤确定是否需要更改PATH变量才能访问编译器和工具。
开始之前xv ▼确定是否需要设置PATH环境变量
1.在命令提示符处键入以下命令,显示PATH变量的当前值。
%echo$PATH
2.查看输出结果,查找包含/opt/SUNWspro/bin/的路径字符串。
如果找到了该路径,表明PATH变量已设置为可以访问编译器和工具。
如果未找到该路径,请按照下一过程中的说明设置PATH环境变量。
▼设置PATH环境变量以便能够对编译器和工具进行访问
1.如果使用Cshell,请编辑您起始目录下的.cshrc文件。
如果使用Bourneshell或Kornshell,请编辑您起始目录下的.profile文件。
2.将以下路径添加至PATH环境变量。
如果您已安装了SunONEStudio软件或ForteDeveloper软件,请将以下路径添加到这些安装软件的路径之前。
/opt/SUNWspro/bin 访问手册页 使用下列步骤确定是否需要更改MANPATH变量才能访问手册页。
▼确定是否需要设置MANPATH环境变量
1.在命令提示符处键入以下命令来请求dbx手册页。
%mandbx
2.查看输出结果(如果有)。
如果无法找到dbx
(1)手册页,或者所显示的手册页并非对应于所安装软件的当前版本,请按照下一过程中的说明设置MANPATH环境变量。
xviFortran编程指南•2004年4月 ▼设置MANPATH环境变量以便能够对手册页进行访问
1.如果使用Cshell,请编辑您起始目录下的.cshrc文件。
如果使用Bourneshell或Kornshell,请编辑您起始目录下的.profile文件。
2.将以下路径添加至MANPATH环境变量。
/opt/SUNWspro/man 访问集成开发环境 SunStudio8集成开发环境(IDE)提供了用于创建、编辑、生成、调试以及分析
C、C++或Fortran应用程序性能的模块。
此IDE需要SunStudio8的核心平台组件。
如果核心平台组件没有安装在下列位置之
一,必须将SPRO_NETBEANS_HOME环境变量设置为核心平台组件的安装位置(installation_beans/3.5R):■缺省安装目录/beans/3.5R■与SunStudio8编译器和工具组件相同的位置(例如,编译器和工具组件安装在 /foo/SUNWspro,核心平台组件安装在/beans/3.5R)用于启动IDE的命令是sunstudio。
有关此命令的详细信息,参见sunstudio
(1)手册页。
访问编译器和工具文档 可在下列位置访问文档:■文档可从随软件一同安装在本地系统或网络上的文档索引中获得,位置在 file:/opt/SUNWspro/docs/index.html。
如果软件未安装在/opt目录中,请向系统管理员询问您系统中的相当路径。
开始之前xvii ■大多数手册都可以从sm网站获得。
下列书目只能通过所安装的软件得到:■《标准C++库类参考》■《标准C++库用户指南》■《Tools.h++类库参考》■《Tools.h++用户指南》 ■发行说明可从网站获得。
■可通过[帮助]菜单获得IDE所有组件的联机帮助,也可通过IDE许多窗口和对话 框中的[帮助]按钮来获得。
在网站()上,您可以通过因特网阅读、打印和购买SunMicrosystems的手册。
如果找不到手册,参见随软件一同安装在本地系统或网络上的文档索引。
注意–Sun对本文档中提及的第三方网站的可用性概不负责,并且不认可也不对此类站点或资源上或通过其获得的任何内容、广告、产品或其它资料负任何责任或义务。
对于因使用或信赖此类站点或资源中提供或通过其提供的任何此类内容、商品或服务而导致或声称导致或与之有关的任何损害或损失,Sun将不负任何责任或义务。
易访问格式文档 我们还提供了易访问格式的文档,便于残疾用户通过辅助技术阅读。
您可以按下表所述找到文档的易访问版本。
如果软件未安装在/opt目录中,请向系统管理员询问您系统中的相当路径。
文档类型 手册(不包括第三方手册)第三方手册:•《标准C++库类参考》•《标准C++库用户指南》•《Tools.h++类库参考》•《Tools.h++用户指南》自述文件和手册页 联机帮助发行说明 易访问版本的格式和位置 HTML格式,位于HTML格式,在已安装软件中通过文档索引访问,位置在file:/opt/SUNWspro/docs/index.html HTML格式,在已安装软件中通过文档索引访问,位置在file:/opt/SUNWspro/docs/index.htmlHTML格式,可通过IDE的[帮助]菜单获得HTML格式,位于 xviiiFortran编程指南•2004年4月 相关编译器和工具文档 下表介绍了可在file:/opt/SUNWspro/docs/index.html和上获得的相关文档。
如果软件未安装在/opt目录中,请向系统管理员询问您系统中的相当路径。
文档名称 《Fortran用户指南》 《Fortran库参考》《OpenMPAPI用户指南》 《数值计算指南》 说明 介绍f95编译器的编译时环境以及命令行选项。
另外还包括传统f77程序到f95的迁移指导。
详细介绍Fortran库和内在例程概述OpenMP多重处理API,并说明与实现有关的细节。
说明浮点计算数值精度涉及到的问题。
开始之前xix 访问Solaris相关文档 下表介绍可通过网站获得的相关文档。
文档集 Solaris参考手册集Solaris软件开发人员集Solaris软件开发人员集 文档名称 参见手册页各部分的书名。
《链接程序和库指南》《多线程编程指南》 说明 提供Solaris操作环境的有关信息。
介绍Solaris链接编辑器及运行时链接程序的操作。
内容包括POSIX和Solaris线程API、使用同步对象编程、编译多线程程序以及查找多线程程序工具。
下表介绍可通过网站获得的相关文档。
文档集 Solaris参考手册集Solaris软件开发人员集Solaris软件开发人员集 文档名称 参见手册页各部分的书名。
《链接程序和库指南》《多线程编程指南》 说明 提供Solaris操作环境的有关信息。
介绍Solaris链接编辑器及运行时链接程序的操作。
内容包括POSIX和Solaris线程API、使用同步对象编程、编译多线程程序以及查找多线程程序工具。
xxFortran编程指南•2004年4月 开发人员资源 访问可找到以下经常更新的资源:■介绍编程技术和最佳办法的文章■内含简短编程技巧的知识库■编译器和工具组件文档,以及对随软件安装文档的更正■支持级别信息■用户论坛■可下载代码范例■新技术预见还可以在上找到其它开发人员资源。
联系Sun技术支持 如果您对于本产品有任何技术问题在本文档中找不到答案,请访问:/service/contacting 发送意见 Sun一直致力于提高其文档质量,欢迎您提出意见和建议。
请将您的意见通过电子邮件发送给Sun,邮件地址:docfeedback@请在您电子邮件的主题行中加入文档的部件号(817-5800-10)。
开始之前xxi xxiiFortran编程指南•2004年4月 第1章 1.1 简介 本书与《Fortran用户指南》所介绍的Sun™StudioFortran95编译器(f95)可在SPARC®和UltraSPARC®平台的Solaris™操作环境下使用。
该编译器符合已发布的Fortran语言标准,并提供了多种扩展功能,其中包括多处理器并行化、完善的代码优化编译以及C/Fortran语言混合支持。
f95编译器还提供Fortran77兼容模式,可接受大多数传统Fortran77源代码。
该编译器集合不再包括单独的Fortran77编译器。
有关FORTRAN77兼容性及迁移问题的信息,参见《Fortran用户指南》第5章。
标准一致性 ■f95的设计目标是兼容ANSIX3.198-1992、ISO/IEC1539:1991和ISO/IEC1539:1997标准文档。
■浮点运算基于IEEE标准754-1985和国际标准IEC60559:1989。
■f95对SPARCV8和SPARCV9(包括UltraSPARC实现)的优化利用功能提供支 持。
这些功能在Prentice-Hall为SPARCInternational发行的《SPARC体系结构手册》第8版(ISBN0-13-825001-4)和第9版(ISBN0-13-099227-5)中进行了定义。
■在本文档中,“标准”意味着符合以上所列标准版本。
“非标准”或“扩展”是指超出这些标准版本的功能。
标准负责团体可能会不时地修订这些标准。
这些编译器所遵循的适用标准的版本可能会进行修订或更替,从而导致SunFortran编译器后期版本功能与早期版本不兼容。
1-
1 1.2 Fortran95编译器的功能 SunStudioFortran95编译器提供下列功能和扩展:■跨越例程的全局程序检查,以保证变量、公共块、参数等的一致性。
■用于多处理器系统经过优化的自动和显式循环并行化。
■VAX/VMSFortran扩展,包括: ■结构、记录、联合、映射■递归■OpenMP并行化指令。
■Cray风格的并行化指令,其中包括TASKCOMMON。
■全局、细部及潜在的并行优化会产生高性能的应用程序。
基准测试显示,与未经过优化的代码相比,经过优化的应用程序运行速度明显加快。
■Solaris系统的通用调用惯例允许将用C或C++编写的例程与Fortran程序合并在一起。
■支持UltraSPARC平台上的具有64位能力的Solaris环境。
■使用%VAL进行按值调用。
■Fortran77和Fortran95程序及目标二进制代码间的兼容性。
■“区间运算”编程。
■某些“Fortran2000”功能,包括“I/O流”。
有关随各软件版本添加到编译器中的新增和扩展功能的详细信息,参见《Fortran用户指南》附录
B。
1.3 其它Fortran公用程序 下列公用程序在用Fortran开发软件程序时可起到辅助作用:■SunStudio性能分析器—单线程和多线程应用程序深层性能分析工具。
参见 analyzer
(1)。
■asa—该Solaris公用程序是一个Fortran输出过滤器,用于打印在第一列中含有 Fortran回车控制符的文件。
使用asa可将用Fortran回车控制惯例格式化的文件转换成按UNIX行式打印机惯例格式化的文件。
参见asa
(1)。
■fdumpmod—用于显示文件或归档文件中所含模块名称的公用程序。
参见fdumpmod
(1)。
■fpp—一个Fortran源代码预处理程序。
参见fpp
(1)。
1-2Fortran编程指南•2004年4月 1.41.51.6 ■fsplit—该公用程序将具有若干例程的一个Fortran文件分成若干个文件,每个文件一个例程。
可对FORTRAN77或Fortran95源文件使用fsplit。
参见fsplit
(1)。
调试公用程序 有下列调试公用程序可用:■-Xlist—用于跨例程检查参数、COMMON块等项一致性的编译器选项。
■SunStudiodbx—提供强大、功能丰富的运行时和静态调试器,还包括一个性能数 据收集器。
SunPerformanceLibrary SunPerformanceLibrary™是用于计算线性代数和傅立叶变换的经过优化的子例程及函数库。
它建立在标准库LAPACK、BLAS1、BLAS2、BLAS3、FFTPACK、VFFTPACK和LINPACK基础之上,这些标准库通常可通过Netlib()获得。
SunPerformanceLibrary中的每个子程序均执行相同的操作,并且与标准库版本具有相同的接口,但通常速度更快、更精确,并且可用于多处理环境。
有关详细信息,参见performance_library自述文件和《SunPerformanceLibrary用户指南》。
(性能库例程手册页见第3P部分。
) 区间运算 Fortran95编译器提供-xia和-xinterval编译器标志,以启用新语言扩展并生成适当代码来实现区间算术计算。
有关详细信息,参见《Fortran95区间运算编程参考》。
第1章简介1-
3 1.7 手册页 联机手册(man)页提供命令、函数、子例程及其相应集合的直接文档。
要访问SunStudio手册页,参见“前言”部分对MANPATH环境变量进行正确设置。
可以通过运行以下命令来显示手册页: demo%ic 在整个Fortran文档中,手册页参考均以主题名加手册部分编号形式出现:f95
(1)用manf95来访问。
其它部分,以ieee_flags(3M)为例,使用带-s选项的man命令访问: demo%man-s3Mieee_flags Fortran库例程编录在手册页第3F部分。
下面列出了Fortran用户需关注的手册页: f95(1)analyzer(1)asa(1)dbx(1)fpp(1)cpp(1)fdumpmod(1)fsplit(1)ieee_flags(3M)ieee_handler(3M)matherr(3M)ild(1)ld
(1) Fortran95命令行选项SunStudio性能分析器Fortran回车控制打印输出后处理程序命令行交互式调试器Fortran源代码预处理程序C源代码预处理程序显示“模块”(.mod)文件的内容。
此预处理程序可将Fortran源例程分成单个文件检查、设置或清除浮点异常位处理浮点异常数学库错误处理例程用于目标文件的增量式链接编辑器用于目标文件的链接编辑器 1-4Fortran编程指南•2004年4月 1.8 自述文件 READMEs目录下包含的文件描述新增功能、软件不兼容性、错误以及手册印刷后发现的信息。
该目录的位置取决于软件安装位置。
路径为:/opt/SUNWspro/READMEs/。
表1-
1 需要关注的自述文件 自述文件 fortran_95 fpp_readmeinterval_arithmeticmath_librariesprofiling_toolsruntime_librariesperformance_library 描述... 本版Fortran95编译器(f95)的新增及更改功能、已知限制、文档勘误。
fpp功能及能力概述f95区间运算功能概述。
可用的优化及专用数学库。
使用性能剖析工具,prof、gprof和tcov。
依据最终用户许可证条款可以重新分发的库及可执行文件。
SunPerformanceLibrary概述 用-xhelp=readme命令行选项,可以很方便地查看每个编译器的自述文件。
例如,命令: %f95-xhelp=readme 将直接显示fortran_95自述文件。
第1章简介1-
5 1.9 命令行帮助 调用编译器的-help选项,可以查看f95命令行选项的扼要说明,如下所示: %f95-help=flags []内为可选项。
<>内为可变参数项。
竖线|表示文字值的选择。
-someoption[={yes|no}]隐含表示-someoption与-someoption=yes等效 _______________________________________________________________ -a 收集tcov基本块剖析数据 mon[=]按指定的边界要求对齐公共块元素;={1|2|4|8|16} -ansi 报告非ANSI扩展。
ar 启用自动循环并行化 -Bdynamic 允许动态链接 -Bstatic 需要静态链接 -
C 启用运行时下标范围检查 -c 仅编译;生成.o文件,但禁止链接 ...其它 1-6Fortran编程指南•2004年4月 第2章 Fortran输入/输出 本章介绍SunStudioFortran95编译器提供的输入/输出功能。
2.1 2.1.1 从Fortran程序内部访问文件 数据通过Fortran逻辑单元在程序、设备或文件间进行传送。
逻辑单元在I/O语句中用逻辑单元号来标识,逻辑单元号是从0到最大4字节整数值(2,147,483,647)的非负整数。
字符*可以作为逻辑单元标识符出现。
当星号出现在READ语句中时,它代表标准输入文件;当它出现在WRITE或PRINT语句中时,代表标准输出文件。
Fortran逻辑单元可通过OPEN语句与特定的命名文件相关联。
另外,在程序开始执行时,某些预连接单元会自动与特定文件相关联。
访问命名文件 OPEN语句的FILE=说明符在运行时建立逻辑单元到命名物理文件的关联。
该文件可以是预先就有的,也可以由程序创建。
OPEN语句中的FILE=说明符可以指定一个简单文件名(FILE='myfile.out'),也可以指定一个前面带有绝对或相对目录路径的文件名(FILE='../Amber/Qproj/myfile.out')。
另外,说明符还可以是字符常量、变量或字符表达式。
可以使用库例程将命令行参数和环境变量以字符变量形式送入程序中,用作OPEN语句中的文件名。
2-
1 以下示例(GetFilNam.f)展示了一种由键入的名称来构建绝对路径文件名的方法。
程序使用库例程GETENV、LNBLNK和GETCWD返回$HOME环境变量的值、查找字符串 中最后的非空格字符、确定当前工作目录: CHARACTERF*128,FN*128,FULLNAME*128PRINT*,'ENTERFILENAME:'READ*,FFN=FULLNAME(F)PRINT*,'PATHIS:',FNEND CHARACTER*128FUNCTIONFULLNAME(NAME) CHARACTERNAME*(*),PREFIX*128
C ThisassumesCshell.
C Leaveabsolutepathnamesunchanged.
C Ifnamestartswith'~/',replacetildewithhome
C directory;otherwiseprefixrelativepathnamewith
C pathtocurrentdirectory. IF(NAME(1:1).EQ.'/')THEN FULLNAME=NAME ELSEIF(NAME(1:2).EQ.'~/')THEN CALLGETENV('HOME',PREFIX) FULLNAME=PREFIX(:LNBLNK(PREFIX))//
1 NAME(2:LNBLNK(NAME)) ELSE CALLGETCWD(PREFIX) FULLNAME=PREFIX(:LNBLNK(PREFIX))//
1 '/'//NAME(:LNBLNK(NAME)) ENDIF RETURN END 编译并运行GetFilNam.f,结果如下: demo%pwd/home/users/auser/subdirdemo%f95-ogetfilGetFilNam.fdemo%getfil ENTERFILENAME:getfil PATHIS:/home/users/auser/subdir/atest.f demo% 2-2Fortran编程指南•2004年4月 2.1.2 2.1.2.1 2.1.2.22.1.2.3 这些例程将在第2-5页中的“向程序传递文件名”中进一步说明。
有关详细信息,参见与getarg(3F)、getcwd(3F)和getenv(3F)相应的手册页条目;这些内容以及其它有用的库例程在《Fortran库参考》中也有介绍。
不用文件名打开文件 OPEN语句不需要指定名称;运行系统会依据若干惯例提供文件名。
打开作为临时文件 在OPEN语句中指定STATUS='SCRATCH',会打开一个名称形如tmp.FAAAxnnnnn的文件,其中,nnnnn用当前进程ID代替,AAA是三个字符的字符串,x是一个字母;AAA和x可保证文件名唯
一。
该文件在程序终止或执行CLOSE语句时被删除。
当在FORTRAN77兼容模式(-f77)下编译时,可以在CLOSE语句中指定STATUS='KEEP'来保留这个临时文件。
(此为非标准扩展。
) 已打开 如果文件已被程序打开,可以使用后续的OPEN语句来更改文件的某些特性;例如BLANK和FORM。
此时,只需指定文件的逻辑单元号以及要更改的参数。
预连接或隐式命名单元 程序执行开始时,会自动将三个单元号与特定的标准I/O文件相关联。
这些预连接单元是标准输入、标准输出以及标准错误:■标准输入是逻辑单元5■标准输出是逻辑单元6■标准错误是逻辑单元0通常,标准输入从工作站键盘接受输入;标准输出和标准错误在工作站屏幕上显示输出。
在其它所有情况下,如果在OPEN语句中指定了逻辑单元号而未在FILE=后指定任何名称,文件将以形如fort.n的名称打开,其中n为逻辑单元号。
第2章Fortran输入/输出2-
3 2.1.3 不用OPEN语句打开文件 在假定使用缺省惯例的情况下,不必非得使用OPEN语句。
如果逻辑单元上的第一个操作是I/O语句,而不是OPEN或INQUIRE,会引用文件fort.n,其中n为逻辑单元号(0、5和6除外,它们有特殊意义)。
这些文件无需在程序执行前就存在。
如果对文件的第一个操作不是OPEN或INQUIRE语句,则会创建这些文件。
示例:以下代码中,如果WRITE是该单元上的第一个输入/输出操作,则会创建文件fort.25: demo%catTestUnit.fIU=25WRITE(IU,'(I4)')IUEND demo% 上述程序将打开文件fort.25,并将一条格式化记录写入该文件: demo%demo%demo% 25demo% f95-otestunittestunitcatfort.25 TestUnit.f 2-4Fortran编程指南•2004年4月 2.1.4 2.1.4.1 2.1.4.2 向程序传递文件名 文件系统没有任何自动便利机制可将Fortran程序中的逻辑单元号与物理文件相关联。
但是,有若干种令人满意的方式可将文件名传给Fortran程序。
通过运行时参数和GETARG 可以使用库例程getarg(3F)在运行时将命令行参数读入一个字符变量。
参数会被解释为文件名并在OPEN语句的FILE=说明符中使用: demo%cattestarg.fCHARACTERoutfile*40 CGetfirstargasoutputfilenameforunit51CALLgetarg(1,outfile)OPEN(51,FILE=outfile)WRITE(51,*)'Writingtofile:',outfileEND demo%f95-otstargtestarg.fdemo%tstargAnyFileNamedemo%catAnyFileName Writingtofile:AnyFileNamedemo% 通过环境变量和GETENV 同样,可以使用库例程getenv(3F)在运行时将任何环境变量的值读入一个字符变量,该变量随后被解释为文件名: demo%cattestenv.fCHARACTERoutfile*40 CGet$OUTFILEasoutputfilenameforunit51CALLgetenv('OUTFILE',outfile)OPEN(51,FILE=outfile)WRITE(51,*)'Writingtofile:',outfileEND demo%f95-otstenvtestenv.fdemo%setenvOUTFILEEnvFileNamedemo%tstenvdemo%catEnvFileName Writingtofile:EnvFileNamedemo% 第2章Fortran输入/输出2-
5 2.1.4.3 使用getarg或getenv时,应该注意前导或尾随的空格。
(Fortran95程序可以使用内在函数TRIM或更早的FORTRAN77库例程LNBLNK())在本章开头的示例中,可以随FULLNAME函数的代码行编写更加灵活的代码来接受相对路径名。
命令行I/O重定向和管道 将物理文件与程序的逻辑单元号相关联的另一方法是通过重定向或管道输送预连接的标准I/O文件。
重定向或管道在运行时执行命令中使用。
采用这种方式,读取标准输入(单元5)和写至标准输出(单元6)或标准错误(单元0)的程序可以通过重定向(在命令行中使用<、>、>>、>&、|、|&、2>、2>&1),读或写至其它任何命名文件。
参见下表: 表2-
1 csh/sh/ksh命令行重定向和管道 操作 标准输入—从mydata读入数据标准输出—写至(覆写)myoutput标准输出—写/追加至myoutput 将标准错误重定向至文件 将标准输出通过管道输送至另一程序的输入 将标准错误和输出通过管道输送至另一程序 使用CShell myprog
2-6Fortran编程指南•2004年4月 2.2 直接I/O 直接或随机I/O允许直接通过记录号访问文件。
记录号在写入记录时分配。
与顺序I/O不同,直接I/O记录可以按任何顺序读写。
但是,在直接访问文件中,所有记录必须具有相同的固定长度。
直接访问文件用文件OPEN语句中的ACCESS='DIRECT'说明符声明。
直接访问文件中的逻辑记录是字节字符串,串长度由OPEN语句的RECL=说明符指定。
READ和WRITE语句指定的逻辑记录不能大于所定义的记录大小。
(记录大小以字节单位指定。
)允许更短的记录。
直接写入非格式化数据将使记录的未填写部分仍保持未定义。
直接写入格式化数据将使未填写的记录用空格进行填充。
直接访问READ和WRITE语句另外还有一个参数REC=n,用来指定要读取或写入的记录号。
示例:直接访问,非格式化: OPEN(
2,FILE='data.db',ACCESS='DIRECT',RECL=200, & FORM='UNFORMATTED',ERR=90) READ(
2,REC=13,ERR=30)
X,Y 本程序以直接访问、非格式化I/O、记录固定长度为200字节的方式打开一个文件,然后将第十三条记录读入X和
Y。
示例:直接访问,格式化: OPEN(
2,FILE='inven.db',ACCESS='DIRECT',RECL=200, & FORM='FORMATTED',ERR=90) READ(
2,FMT='(I10,F10.3)',REC=13,ERR=30)
X,Y 本程序以直接访问、格式化I/O、记录固定长度为200字节的方式打开一个文件。
然后读取第十三条记录,并以(I10,F10.3)格式对其进行转换。
对于格式化文件,所写记录的大小由FORMAT语句确定。
在上述示例中,FORMAT语句所定义的记录大小为20个字符或字节。
如果列表中的数据总量大于FORMAT语句中指定的记录大小,则可通过单条格式化写入指令写入一条以上的记录。
在此种情况下,会为随后的每一条记录赋予连续的记录号。
示例:直接访问、格式化、多记录写入: OPEN(21,ACCESS='DIRECT',RECL=200,FORM='FORMATTED')WRITE(21,'(10F10.3)',REC=11)(X(J),J=1,100) 第2章Fortran输入/输出2-
7 2.3 写至直接访问单元21的写指令会创建10条记录,每条记录10个元素(因为格式指定每条记录10个元素),这些记录从11到20进行编号。
二进制I/O SunStudioFortran95扩展了OPEN语句,允许声明“二进制”I/O文件。
用FORM='BINARY'打开文件与用FORM='UNFORMATTED'打开文件所达到的效果大致相同,除了不会在文件中嵌入任何记录长度。
没有该数据,将无法判断一条记录的开始或结束位置。
因而,不能在FORM='BINARY'文件中执行BACKSPACE,因为无法判断回退的位置。
对'BINARY'文件执行READ,将会根据需要读取尽可能多的数据来填充输入列表中的变量。
■WRITE语句:将数据以二进制形式写入文件,根据输出列表指定的数量传送尽量多 的字节。
■READ语句:将数据读入输入列表中的变量,按列表要求传送尽量多的字节。
由于文 件中无记录标记,因而不会检测到“记录结束”错误。
只能检测到“文件结束”或系统异常错误。
■INQUIRE语句:对用FORM=”BINARY”打开的文件执行INQUIRE会返回以下结果:FORM=”BINARY”ACCESS=”SEQUENTIAL”DIRECT=”NO”FORMATTED=”NO”UNFORMATTED=”YES”RECL=和NEXTREC=未定义■BACKSPACE语句:不允许—会返回错误。
■ENDFILE语句:与通常一样在当前位置截断文件。
■REWIND语句:与通常一样将文件重新定位至数据开头。
2-8Fortran编程指南•2004年4月 2.4 I/O流 新的I/O“流”方案已被提议作为Fortran2000标准草案的一部分,并且在f95中得以实现。
I/O流式访问将数据文件视作连续的字节序列,用从1开始的正整数来寻址。
可用OPEN语句中的ACCESS=’STREAM’说明符来定义I/O流文件。
字节地址文件定位需要在READ或WRITE语句中有POS=scalar_integer_expression说明符。
INQUIRE语句接受ACCESS=’STREAM’、说明符STREAM=scalar_character_variable以及POS=scalar_integer_variable。
第2章Fortran输入/输出2-
9 流I/O在与C程序创建或读取的文件进行互操作时非常有用,如下例所示: Fortran95程序读取由Cfwrite()创建的文件。
programreaderinteger::a(1024),i,resultopen(file="test",unit=8,ess="stream",form="unformatted") !
readallofaread(8)adoi=1,1024if(a(i).ne.i-1)print*,’errorat’,ienddo !
readthefilebackwarddoi=1024,
1,-1read(8,pos=(i-1)*4+1)resultif(result.ne.i-1)print*,’errorat’,ienddoclose
(8) end C程序写入一个文件 #include
Fortran95读取程序以数组方式一次读取这些数据,然后再在文件中从后往前分别读取它们。
第二条read语句中的pos=说明符说明位置是用字节表示的,从字节1开始(这一点与C相反,在C中,位置从字节0开始)。
2-10Fortran编程指南•2004年4月 2.5 内部文件 内部文件是CHARACTER类型的对象,如变量、子串、数组、数组元素或者结构记录的字段。
内部文件READ可以来自常量字符串。
内部文件I/O通过由一个字符对象向另一数据对象传送和转换数据,模拟格式化READ和WRITE语句。
不执行任何文件I/O。
使用内部文件时:■出现在WRITE语句中的是接收数据的字符对象的名称而非单元号。
在READ语句 中,出现的也是字符对象源的名称而非单元号。
■常量、变量或子串对象构成文件中的单条记录。
■使用数组对象,每个数组元素对应于一条记录。
■内部文件上的直接I/O。
(Fortran95标准只包括内部文件上的顺序格式化I/O。
) 除了不能更改文件中的记录数之外,这一点与外部文件上的直接I/O相似。
此时,记录是字符串数组的单个元素。
这项非标准扩展仅在用-f77标志进行编译时的FORTRAN77兼容模式下可用。
■每一顺序READ或WRITE语句均始于内部文件的开头。
示例:从内部文件(仅有一条记录)中以顺序、格式化方式进行读取: demo%catintern1.fCHARACTERX*80READ(*,'(A)')XREAD(
X,'(I3,I4)')N1,N2!
ThiscodelinereadstheinternalfileXWRITE(*,*)N1,N2END demo%f95-otstinternintern1.fdemo%tstintern 12991299demo% 第2章Fortran输入/输出2-11 示例:从内部文件(三条记录)中以顺序、格式化方式进行读取: demo% demo%demo% 81demo% catintern2.fCHARACTERLINE
(4)*16DATALINE
(1)/'8181'/DATALINE
(2)/'8282'/DATALINE
(3)/'8383'/DATALINE
(4)/'8484'/READ(LINE,'(2I4)')
I,J,
K,L,
M,NPRINT*,
I,J,
K,L,
M,NENDf95intern2.fa.out 8182828383 示例:在-f77兼容模式下,从内部文件(一条记录)中以直接访问方式进行读取: demo%catintern3.f CHARACTERLINE
(4)*16 DATALINE
(1)/'8181'/ DATALINE
(2)/'8282'/ DATALINE
(3)/'8383'/ DATALINE
(4)/'8484'/ READ(LINE,FMT=20,REC=3)
M,N 20 FORMAT(I4,I4) PRINT*,
M,N END demo%f95-f77intern3.f demo%a.out 8383 demo% 2-12Fortran编程指南•2004年4月 2.6 其它I/O注意事项 Fortran95及传统Fortran77程序在I/O上是兼容的。
包含f77和f95混合编译代码的可执行文件可以同时从程序的f77和f95部分对同一单元执行I/O。
但是,Fortran95还提供了一些附加功能:■ADVANCE='NO'允许进行非提前式I/O,如下所示: write(*,'(a)',ADVANCE='NO')'Entersize='read(*,*)n ■NAMELIST输入功能:■f95允许在输入时在组名前冠以$或&。
Fortran95标准只接受&,并且此为NAMELIST写语句的输出内容。
■f95接受$作为输入组的终止符号,除非组中的最后一个数据项为CHARACTER,此时,$被视为输入数据。
■f95允许NAMELIST输入开始于记录的第一列。
■正如f77所做的那样,f95承认并实现了ENCODE和DECODE。
有关f95与f77间的Fortran95I/O扩展及兼容性方面的其它信息,参见《Fortran用户指南》。
第2章Fortran输入/输出2-13 2-14Fortran编程指南•2004年4月 第3章 程序开发 本章简要介绍两个功能强大的程序开发工具make和SCCS,这两个工具可以非常成功地用于Fortran编程项目。
目前有许多关于使用make和SCCS的优秀的商业出版书籍,其中包括ManagingProjectswithmake(AndrewOram和SteveTalbott著)和ApplyingRCSandSCCS(DonBolinger和TanBronson著)。
这两本书均出自O’Reilly&Associates。
3.1 3.1.1 使用make公用程序简化程序构建 make公用程序可以智能地执行程序编译和链接任务。
大型应用程序通常由一组源文件和INCLUDE文件组成,同时要求与许多库进行链接。
修改任何一个或多个源文件需要重新编译程序的修改部分并重新链接。
通过指定组成应用程序的文件间的相互依赖性以及重新编译和重新链接每一程序块所需的命令,可以自动执行这一过程。
只要在指令文件中包括这些说明,make便会确保只重新编译那些需要重新编译的文件,并确保重新链接使用所需的选项和库来生成可行性文件。
以下讨论内容提供了一个如何使用make的简单示例。
有关摘要信息,参见make(1S)。
Makefile 名为makefile的文件以结构化方式告知make都有哪些源文件和目标文件依赖其它文件。
它还定义了编译和链接文件所需的命令。
3-
1 例如,假设您的程序有四个源文件以及相应的makefile文件: demo%lsputepts.fpattern.fstartupcore.fdemo% 假设pattern.f和putepts.f都有一个名为monblock的INCLUDE,并且您希望编译每个.f文件并将这三个可重定位的文件与一系列库一起链接成一个名为pattern的程序。
这时,makefile将会如下所示: demo%catmakefilepattern:putepts.ostartupcore.o f95putepts.ostartupcore.o–lcore95\–lcore–lsunwindow–lpixrect–opatternpattern.o:monblockf95–c–uputepts.o:monblockf95–c–putepts.fstartupcore.o:startupcore.ff95–c–ustartupcore.fdemo% makefile的第一行指示pattern的创建取决于pattern.o、putepts.o和startupcore.o。
下一行及其后续各行给出了由可重定位的.o文件和库创建pattern的命令。
makefile中的每一条都是一项规则,它描述了目标对象的依赖性以及创建该对象所需的命令。
规则的结构为:target:dependencies-listTABmands■依赖性。
每条的头一行均是为目标文件命名,其后是目标依赖的所有文件。
■命令。
每条随后还有一行或多行,这些行指定将生成本条相应的目标文件的Bourne shell命令。
这些命令行中的每一行都必须用一个制表符缩进。
3-2Fortran编程指南•2004年4月 3.1.23.1.3 make命令 make命令可以进行无参数调用,只需键入: demo%make make公用程序在当前目录中寻找名为makefile或Makefile的文件并从该文件中获取指令。
make公用程序:■读取makefile,确定其必须处理的所有目标文件、这些目标文件依赖的文件以及 生成这些目标文件所需的命令。
■查找每个文件的最后更改日期和时间。
■如果有任何目标文件比其依赖的任一文件时间更久,使用makefile中与该目标相 应的命令重新生成该目标文件。
宏 make公用程序的宏功能允许进行简单的无参数字符串替换。
例如,可将组成目标程序pattern的可重定位文件的列表表示为单个宏字符串,使其更易于更改。
宏字符串定义具有以下格式:NAME=string宏字符串的使用方式如下所示:$(NAME)make会用宏字符串的实际值来替换它。
以下示例将命名所有目标文件的宏定义添加到makefile的开头: OBJ=putepts.ostartupcore.o 现在便可在依赖性列表以及与makefile中的目标pattern相应的f95链接命令中同时使用宏了。
pattern:$(OBJ)f95$(OBJ)–lcore95–lcore–lsunwindow\–lpixrect–opattern 第3章程序开发3-
3 3.1.43.1.5 对于名称为单个字母的宏字符串,可以省略括号。
覆盖宏值 make宏的初始值可以用make的命令行选项进行覆盖。
例如: FFLAGS=–uOBJ=putepts.ostartupcore.opattern:$(OBJ) f95$(FFLAGS)$(OBJ)–lcore95–lcore–lsunwindow\–lpixrect–opatternpattern.o:monblockf95$(FFLAGS)-cputepts.o:f95$(FFLAGS)–putepts.f 现在,简单的无参数make命令将会使用上面设置的FFLAGS值。
不过,这可以通过命令行来覆盖: demo%make"FFLAGS=–u–O" 这里,make命令行中的FFLAGS宏定义会覆盖makefile的初始值,并且会将-O标志和-u标志一起传递给f95。
注意,也可以在命令中使用"FFLAGS=",将宏重置为空字符串以使其不再有效。
make中的后缀规则 为使makefile更易编写,make将根据目标文件的后缀,使用自身的缺省规则。
缺省规则在文件/usr/share/lib/make/make.rules中。
在识别缺省的后缀规则时,make会将FFLAGS宏指定的任何标志、-c标志以及要编辑的源文件名都作为参数进行传递。
此外,make.rules文件还使用FC宏赋予的名称作为要使用的Fortran编译器的名称。
3-4Fortran编程指南•2004年4月 3.1.6 以下示例两次说明了这一规则: FC=f95OBJ=putepts.ostartupcore.oFFLAGS=–upattern:$(OBJ) f95$(OBJ)–lcore95–lcore–lsunwindow\–lpixrect–opatternpattern.o:monblockf95$(FFLAGS)–cputepts.o:monblockstartupcore.o:startupcore.f make使用缺省规则编译putepts.f和startupcore.f。
.f90文件存在缺省的后缀规则,这些规则将会调用f95编译器。
然而,除非将FC宏定义为f95,否则.f和.F文件的缺省后缀规则会调用f77而非f95。
而且,当前没有为.f95和.F95文件定义后缀规则,.modFortran95模块文件将会调用Modula编译器。
要对此进行补救,需要在调用make的目录下为make.rules文件创建您自己的本地副本,同时对该文件进行修改,添加.f95和.F95后缀规则,删除.mod的后缀规则。
有关详细信息,参见make(1S)手册页。
.KEEP_STATE与特殊依赖性检查 使用特殊目标.KEEP_STATE检查命令的依赖性及隐藏依赖性。
当.KEEP_STATE:目标有效时,make会根据状态文件检查用于生成目标的命令。
如果自上次make运行以来命令已更改,make会重新生成此目标。
当.KEEP_STATE:目标有效时,make会从cpp
(1)以及其它编译处理程序中,读取任何“隐藏”文件(如#include文件)的相应报告。
如果目标相对于这些文件中的任何文件已过期,make会重新生成它。
第3章程序开发3-
5 3.2 用SCCS进行版本跟踪和控制 SCCS代表源代码控制系统。
SCCS为实现以下目标提供了途径:■跟踪源文件的演变—即其更改历史■防止源文件被其它开发人员同时更改■通过提供版本标记来跟踪版本号 SCCS的三项基本操作是:■将文件置于SCCS控制下■签出文件进行编辑■签入文件 本部分以上一程序为例向您展示如何使用SCCS来执行这些任务。
只对基本的SCCS进行了说明,并且只介绍了三个SCCS命令:create、edit和delget。
3.2.1 用SCCS控制文件 将文件置于SCCS控制下包括以下方面:■建立SCCS目录■在文件中插入SCCSID关键字(这是可选的)■创建SCCS文件 3.2.1.1 创建SCCS目录 首先,必须在正在开发程序的目录下创建SCCS子目录。
使用以下命令:demo%mkdirSCCS SCCS必须采用大写字母。
3.2.1.2 插入SCCSID关键字 有些开发者会在每个文件中放入一个或多个SCCSID关键字,但这是可选的。
以后,每次用SCCSget或delget命令签入文件时,都会用版本号来标识这些关键字。
有三种可能的位置可以放置这些字符串: ■注释行■参数语句■初始化数据 3-6Fortran编程指南•2004年4月 使用关键字的优点是版本信息会出现在源列表和已编译的目标程序中。
如果其前面有字符串@(#),可用what命令打印目标文件中的关键字。
只含有参数和数据定义语句的已包含头文件不会生成任何初始化数据,因此这些文件的关键字通常置于注释或参数语句中。
在某些文件中,如ASCII数据文件或makefile,SCCS信息将会出现在注释中。
SCCS关键字以%keyword%形式出现,并通过SCCSget命令扩展成各自的值。
最常用的关键字有: %Z%扩展为what命令识别的标识字符串@(#)。
%M%扩展为源文件名。
%I%扩展为本SCCS维护文件的版本号。
%E%扩展为当前日期。
例如,可以用包含以下关键字的make注释来标识makefile。
# %Z%%M% %I% %E% 源文件startupcore.f、putepts.f和pattern.f可以通过以下格式的初始化数据来标识: CHARACTER*50SCCSID DATASCCSID/"%Z%%M% %I% %E%\n"/ 用SCCS处理该文件,进行编译,然后用SCCSwhat命令处理目标文件,显示如下: demo%f95-cpattern.f...demo%whatpatternpattern: pattern.f1.296/06/10 您还可以创建名为CTIME的PARAMETER,无论何时用get命令访问文件,该参数都会自动进行更新。
CHARACTER*(*)CTIMEPARAMETER(CTIME="%E%") INCLUDE文件可以用含有SCCS标记的Fortran注释加以注解:
C %Z%%M% %I% %E% 第3章程序开发3-
7 3.2.1.3 注–在Fortran95源代码文件中使用单字母派生类型组件名可能会与SCCS关键字识别产生冲突。
例如,当通过SCCS传递时,Fortran95结构组件引用X%Y%Z在执行SCCSget后会变成XZ。
当在Fortran95程序中使用SCCS时,应注意不要用单个字母定义结构组件。
例如,假如Fortran95程序中的结构引用是X%YY%
Z,SCCS并不会将%YY%解释为关键字引用。
或者,SCCSget-k选项在检索文件时将不会扩展SCCS关键字ID。
创建SCCS文件 现在,可以用SCCScreate命令将这些文件置于SCCS控制之下: demo%screatemonblockstartupcore.f\putepts.fpattern.f demo% 3.2.2 签出和签入文件 一旦源代码处于SCCS控制之下,便可用SCCS执行以下两项主要任务:签出文件以便能对其进行编辑;签入已编辑完的文件。
签出文件使用sedit命令。
例如: demo%sputepts.f 然后,SCCS会在当前目录下创建putepts.f的可写副本,并记录您的登录名。
当文件已签出时,其他用户不能再签出该文件,但可以查出是谁签出了该文件。
完成编辑后,可用sdelget命令签入已修改的文件。
例如: demo%sputepts.f 该命令会使SCCS系统做以下事情:■通过比较登录名确保您就是签出文件的用户■提示您对更改做注释■记录本次编辑会话所更改的内容■从当前目录中删除putepts.f的可写副本■用扩展了SCCS关键字的只读副本替换可写副本 3-8Fortran编程指南•2004年4月 sdelget命令是两个简单SCCS命令(delta和get)的复合命令。
delta命令执行上述列表中的前三项任务;get命令执行后两项任务。
第3章程序开发3-
9 3-10Fortran编程指南•2004年4月 第4章 4.1 库 本章介绍如何使用和创建子程序库。
对静态和动态库均进行了讨论。
认识库 软件库通常是事先已编译并组织成单个二进制库文件的子程序集。
集中的每个成员称为库元素或模块。
链接程序搜索库文件,在生成可执行二进制程序时加载用户程序所引用的目标模块。
有关详细信息,参见ld
(1)和Solaris《链接程序和库指南》。
软件库有两种基本类型:■静态库。
该库中的模块在执行前即被联编到执行文件中。
静态库通常以libname.a 命名。
.a后缀指的是归档。
■动态库。
该库中的模块可在运行时联编到可执行程序中。
动态库通常以 libname.so命名。
.so后缀指的是共享对象。
既有静态(.a)版本又有动态(.so)版本的典型系统库有:■Fortran95库:libfsu、libfui、libfai、libfai2、libfsumai、 libfprodai、libfminlai、libfmaxlai、libminvai、libmaxvai、libifai、pat■C库:libc使用库有两个优点:■对于程序调用的库例程,不需要有源代码。
■只加载所需的模块。
库文件为程序共享常用的子例程提供了一条简单途径。
只需在链接程序时给出库名便可,那些解析程序中引用的库模块将被链接并合并到可执行文件中。
4-
1 4.2 4.2.1 指定链接程序调试选项 通过LD_OPTIONS环境变量向链接程序传递其它选项,可以获得库用法和加载方面的摘要信息。
在生成目标二进制文件时,编译器会用这些选项(以及它要求的其它选项)调用链接程序。
始终建议使用编译器调用链接程序,而不是直接调用链接程序,因为许多编译器选项要求特定的链接程序选项或库引用,缺少这些,链接时会产生无法预料的结果。
示例:使用LD_OPTIONS创建加载映射: demo%setenvLD_OPTIONS’–m–Dfiles’demo%f95–omyprogmyprog.f 某些链接程序选项尚有等价的编译器命令行选项,它们可以直接在f95命令中出现。
这些选项包括–Bx、–dx、–
G、–hname、–Rpath和–ztext。
有关详细信息,参见f95
(1)手册页或《Fortran用户指南》。
在Solaris《链接程序和库指南》中,可以找到链接程序选项和环境变量的更多详细示例和解释。
生成加载映射 链接程序–m选项会生成显示库链接信息的加载映射。
可执行二进制程序生成期间链接的例程会与其来自的库一起被列出。
4-2Fortran编程指南•2004年4月 4.2.2 示例:使用–m生成加载映射: demo%setenvLD_OPTIONS’-m’demo%f95any.fany.f: MAIN:链接编辑器内存映射 输出输入区区地址 虚拟大小 .interp .hash .dynsym .dynstr .text.text.text.text.text... 100d4.interp100d4 100e8.hash100e8 103d0.dynsym103d0 10a20.dynstr10a20 10c9010c9010c9010d8410d88 1111(null)2e82e8(null)650650(null)366366(null)1e7000/opt/SUNWspro/lib/crti.of4/opt/SUNWspro/lib/crt1.o00/opt/SUNWspro/lib/values-xi.od20sparse.o 列出其它信息 其它链接程序调试功能可通过链接程序的–Dkeyword选项获得。
使用–Dhelp选项可以显示完整的列表。
示例:使用–Dhelp选项列出链接程序调试辅助选项: demo%ld–Dhelp… debug:argsdebug:bindingsdebug:detaildebug:entry …demo% 显示输入参数处理显示符号绑定;提供详细信息显示入口标准描述符 第4章库4-
3 4.2.3 例如,–Dfiles链接程序选项会列出链接过程中引用的所有文件和库: demo%setenvLD_OPTIONS’-Dfiles’demo%f95direct.fdirect.f: MAINdirect:debug:file=/opt/SUNWspro/lib/crti.o[ET_REL]debug:file=/opt/SUNWspro/lib/crt1.o[ET_REL]debug:file=/opt/SUNWspro/lib/values–xi.o[ET_REL]debug:file=direct.o[ET_REL]debug:file=/opt/SUNWspro/lib/libM77.a[archive]debug:file=/opt/SUNWspro/lib/libF77.so[ET_DYN]debug:file=/opt/SUNWspro/lib/libsunmath.a[archive] … 有关这些链接程序选项的更为详细的信息,参见《链接程序和库指南》。
编译和链接一致性 每当分步完成编译和链接时,确保编译和链接选项的一致选择是至关重要的。
用某些选项编译程序的任何部分均需要使用相同的选项进行链接。
另外,许多选项要求使用该选项编译所有源文件,包括链接步骤。
《Fortran用户指南》中的选项说明具体指出了此类选项。
示例:用-ast编译sbr.f,编译C例程,然后进行分步链接: demo%f95-c-fastsbr.fdemo%-c-fastsimm.cdemo%f95-fastsbr.osimm.o 链接步骤;将-fast传递给链接程序 4-4Fortran编程指南•2004年4月 4.3 4.3.1 4.3.1.1 4.3.1.2 4.3.2 设置库搜索路径和顺序 链接程序按某一规定顺序在若干位置搜索库。
这些位置中有一些是标准路径,有一些则取决于编译器选项-Rpath、–llibrary、–Ldir以及环境变量LD_LIBRARY_PATH。
标准库路径的搜索顺序 链接程序所用的标准库搜索路径由安装路径确定,对于静态和动态加载,它们会有所不同。
标准安装将SunStudio编译器软件置于/opt/SUNWspro/下。
静态链接 生成可执行文件时,静态链接程序按指定顺序、在以下路径(夹在其它路径中)中搜索任何可能有的库: /opt/SUNWspro/lib/s/lib//usr/lib SunStudio共享库SVr4软件的标准位置UNIX软件的标准位置 这些是链接程序所用的缺省路径。
动态链接 动态链接程序在运行时按指定顺序搜索共享库:■用户使用-Rpath指定的路径■/opt/SUNWspro/lib/■/usr/lib标准UNIX缺省值 这些搜索路径被内置于可执行文件中。
LD_LIBRARY_PATH环境变量 使用LD_LIBRARY_PATH环境变量指定链接程序应在哪些目录路径中搜索用–llibrary选项指定的库。
第4章库4-
5 可以指定多个目录,其间用冒号分隔。
通常,LD_LIBRARY_PATH变量包含两个用冒号分隔的目录列表,列表间用分号隔开: dirlist1;dirlist2 首先搜索dirlist1中的目录,接着是命令行上用任何显式–Ldir指定的目录,再接着是dirlist2以及标准目录。
也就是说,如果以任意多次的–L调用编译器,如下所示:f95...–Lpath1...–Lpathn... 则搜索顺序是:dirlist1path1...pathndirlist2standard_paths 当LD_LIBRARY_PATH变量只包含一个用冒号分隔的目录列表时,它会被解释为dirlist2。
在Solaris操作环境中,在搜索64位依赖性时,可以用相似的环境变量LD_LIBRARY_PATH_64来替代LD_LIBRARY_PATH。
有关详细信息,参见Solaris《链接程序和库指南》以及ld
(1)手册页。
■在32位SPARC处理器上,会忽略LD_LIBRARY_PATH_64。
■如果只定义了LD_LIBRARY_PATH,它将被同时用于32位和64位链接。
■如果同时定义了LD_LIBRARY_PATH和LD_LIBRARY_PATH_64,则32位链接将 用LD_LIBRARY_PATH来完成,而用LD_LIBRARY_PATH_64进行64位链接。
注–强烈建议不要对效率型软件使用LD_LIBRARY_PATH环境变量。
尽管它作为一种影响运行时链接程序搜索路径的临时机制很有用,但是任何可以引用该环境变量的动态可执行程序的搜索路径都会被改变。
您可能会看到了意想不到的结果或性能降低。
4.3.3 库搜索路径和顺序—静态链接 使用-llibrary编译器选项给出链接程序在解析外部引用时要搜索的其它库名。
例如,用选项–lmylib将库libmylib.so或libmylib.a添加到搜索列表中。
链接程序会在标准目录路径中寻找其它的libmylib库。
–L选项(和LD_LIBRARY_PATH环境变量)会创建一个路径列表,告知链接程序到哪里寻找位于标准路径以外的库。
假如libmylib.a在目录/home/proj/libs中,则选项–L/home/proj/libs会告知链接程序在生成可执行文件时到哪里寻找: demo%f95–opgrampart1.opart2.o–L/home/proj/libs–lmylib 4-6Fortran编程指南•2004年4月 4.3.3.14.3.3.2 4.3.4 4.3.4.1 4.3.4.2 –llibrary选项的命令行顺序 对于任何未解析的特殊引用,只对库进行一次搜索,并且只搜索其时在搜索中未定义的符号。
如果在命令行上列出了多个库,则会按其在命令行上出现的顺序来搜索这些库。
将–llibrary选项放置在以下位置:■将–llibrary选项置于任一.f、.for、.F、.f95或.o文件之后。
■如果调用了libx中的函数,并且这些函数引用了liby中的函数,则将–lx置于 –ly之前。
–Ldir选项的命令行顺序 –Ldir选项会将dir目录路径添加到库搜索列表中。
链接程序首先在–L选项指定的任何目录中搜索库,然后在标准目录中进行搜索。
只有将其放在它所应用的–llibrary选项之前,该选项才有用。
库搜索路径和顺序—动态链接 对于动态库,库搜索路径和加载顺序的更改与静态情况不同。
实际链接发生在运行时而不是生成时。
在生成时指定动态库 生成可执行文件时,链接程序会在可执行文件本身中记录共享库的路径。
这些搜索路径可以用–Rpath选项指定。
这一点与-Ldir选项相反,该选项在生成时指示到哪里查找-llibrary选项所指定的库,但不会将该路径记录到二进制可执行文件中。
使用dump命令可以查看创建可执行文件时内置的目录路径。
示例:列出内置于a.out之中的目录路径: demo%f95program.f-R/home/proj/libs-L/home/proj/libs-lmylib demo%dump–Lva.out|grepRPATH [5] RPATH/home/proj/libs:/opt/SUNWspro/lib 在运行时指定动态库 在运行时,链接程序会确定到哪里查找可执行文件所需的动态库:■运行时的LD_LIBRARY_PATH值■生成可执行文件时已由–R指定的路径 第4章库4-
7 4.3.4.3 如前所述,使用LD_LIBRARY_PATH能带来意想不到的副作用,因而不建议这样做。
修复动态链接期间的错误 当动态链接程序找不到所需库的位置时,它会发出以下错误消息: ld.so:prog:致命:libmylib.so:无法打开文件: 此消息指示库不在其应在的位置。
您也许在生成可执行文件时指定了共享库的路径,但这些库随后已被移动。
例如,您可能先用/my/libs/中您自己的动态库生成了a.out,而后来又将这些库移到了另一目录。
使用ldd确定可执行文件期望在哪儿找到这些库: demo%ldda.out libfui.so.1=>/opt/SUNWspro/lib/libfui.so.1 libfai.so.1=>/opt/SUNWspro/lib/libfai.so.1 libfai2.so.1=>/opt/SUNWspro/lib/libfai2.so.1 libfsumai.so.1=>/opt/SUNWspro/lib/libfsumai.so.1 libfprodai.so.1=>/opt/SUNWspro/lib/libfprodai.so.1 libfminlai.so.1=>/opt/SUNWspro/lib/libfminlai.so.1 libfmaxlai.so.1=>/opt/SUNWspro/lib/libfmaxlai.so.1 libfminvai.so.1=>/opt/SUNWspro/lib/libfminvai.so.1 libfmaxvai.so.1=>/opt/SUNWspro/lib/libfmaxvai.so.1 libfsu.so.1=>/opt/SUNWspro/lib/libfsu.so.1 libsunmath.so.1=>/opt/SUNWspro/lib/libsunmath.so.1 libm.so.1=> /usr/lib/libm.so.1 libc.so.1=> /usr/lib/libc.so.1 libdl.so.1=>/usr/lib/libdl.so.1 /usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1 如果可能的话,将这些库移动或复制到正确的目录中,或者在链接程序搜索的目录中建
立到该目录的软链接(使用ln-s)。
或者,也可能是没有正确设置LD_LIBRARY_PATH。
检查LD_LIBRARY_PATH是否包含运行时所需库的路径。
4-8Fortran编程指南•2004年4月 4.4 4.4.1 创建静态库 静态库文件是使用ar
(1)公用程序由预编译的目标文件(o文件)生成的。
链接程序从库中提取在当前链接的程序内引用了其入口点的任何元素,如子程序、入口名或BLOCKDATA子程序中已初始化的COMMON块。
这些提取出来的元素(例程)会被永久联编到链接程序生成的a.out可执行文件中。
权衡静态库 与动态情况相比,关于静态库和链接,有三个主要问题需要谨记:■静态库更加自主,但适应能力较差。
如果以静态方式联编a.out可执行文件,它所需的库例程会变成可执行二进制文件的一部分。
但是,如果需要更新联编到a.out可执行文件中的静态库例程,则必须重新链接并重新生成整个a.out文件以利用已更新的库。
对于动态库,库并不是a.out文件的一部分,并且链接是在运行时完成的。
要利用已更新的动态库,只需将新库安装在系统中即可。
■静态库中的“元素”是单独的编译单元,即.o文件。
由于单个编译单元(源文件)可以包含多个子程序,因此这些例程在一起编译时会变成静态库中的单一模块。
这就意味着会将编译单元中的所有例程一起装入a.out可执行文件中,即使实际只调用了那些子程序中的一个。
通过优化库例程分发到可编译源文件中的方式,可以改善这种情况。
(尽管如此,只有程序实际引用的那些库模块才会被装入可执行文件。
)■链接静态库时,顺序很重要。
链接程序按输入文件在命令行上出现的顺序对其进行处理—从左至右。
当链接程序决定是否从库中加载某一元素时,其决定取决于它已经处理的库元素。
该顺序不仅依赖于元素在库文件中的出现顺序,而且还依赖于编译命令行中指定库的顺序。
示例:如果Fortran程序在两个文件(main.f和crunch.f)中,并且只有后者访问某个库,则在crunch.f或crunch.o之前引用该库是错误的: demo%f95main.f–lmylibrarycrunch.f–omyprog(不正确) demo%f95main.fcrunch.f–lmylibrary–omyprog(正确) 第4章库4-
9 4.4.2 简单静态库的创建 假设您可以将程序中的所有例程分布在一组源文件中,同时假定这些文件全部包含在子目录test_lib/中。
进一步假定这些文件是以这样一种方式组织的:它们每一个都只包含一个用户程序将会调用的主要子程序,同时还包含该子程序可能会调用的任何“帮助程序”例程,但这些例程不会从库中的任何其它例程中调用。
另外,从一个以上库例程中调用的任何帮助程序例程均被集合到单个源文件中。
这样就给出了一个组织得非常合理的源文件及目标文件集。
假定每个源文件的名称均取自文件中第一个例程的名称,在多数情况下,该例程是库中的主要文件之一: demo%cdtest_lib demo%ls 总数14 2dropx.f 2delte.f 2etc.f 2evalx.f2linkz.f 2markx.f2point.f 更低级的“帮助程序”例程被集合到文件etc.f中。
其它文件可以包含一个或多个子程序。
首先,使用–c选项编译每一个库源文件,生成相应的可重定位的.o文件: demo%f95–c*.f demo%ls 总数42 2dropx.f 4etc.o 2delte.f 4dropx.o 4delte.o 2etc.f demo% 2linkz.f2evalx.f4evalx.o 4markx.o4linkz.o2markx.f 2point.f4point.o 现在,使用ar创建静态库testlib.a:demo%arcrtestlib.a*.o 4-10Fortran编程指南•2004年4月 4.4.2.1 要使用该库,或者在编译命令中包括此库文件,或者使用–l和–L编译选项。
以下示例直接使用.a文件: demo%cattrylib.fCprogramtotesttestlibroutines x=21.998callevalx(x)callpoint(x)print*,'value',xenddemo%f95–otrylibtrylib.ftest_lib/testlib.ademo% 注意,主程序只调用库中的两个例程。
您可以验证并未将库中未调用的例程装入可执行文件,方法是查找用nm显示的可执行文件的名称列表中是否有这些例程。
demo%nmtrylib|grepFUNC|greppoint [146] | 70016| 152|FUNC|GLOB|0|
8 demo%nmtrylib|grepFUNC|grepevalx [165] | 69848| 152|FUNC|GLOB|0|
8 demo%nmtrylib|grepFUNC|grepdelte demo%nmtrylib|grepFUNC|grepmarkxdemo%..etc |point_|evalx_ 在上述示例中,grep只在名称列表中查找与实际调用的那些库例程相应的项。
引用库的另一方法是通过–llibrary和–Lpath选项。
这里,必须更改库的名称以符合libname.a惯例: demo%mvtest_lib/testlib.atest_lib/libtestlib.ademo%f95–otrylibtrylib.f–Ltest_lib–ltestlib –llibrary和–Lpath选项与安装在系统可公共访问目录(如/usr/local/lib)中的库一起使用,以便其他用户可以引用它。
例如,假如将libtestlib.a留在/usr/local/lib中,可以通知其他用户使用以下命令编译: demo%f95–omyprogmyprog.f–L/usr/local/lib–ltestlib 静态库中的替换 如果仅有几个元素需要重新编译,没有必要重新编译整个库。
ar的–r选项允许替换静态库中的个别元素。
第4章库4-11 4.4.2.2 示例:重新编译并替换静态库中的单个例程:demo%f95–cpoint.fdemo%ar-rtestlib.apoint.o 对静态库中的例程进行排序 要在ar正在生成静态库时对其中的元素进行排序,请使用命令lorder
(1)和tsort
(1): demo%ar-crmylib.a'lorderexg.ofofx.odiffz.o|tsort' 4-12Fortran编程指南•2004年4月 4.5 4.5.1 创建动态库 动态库文件是由链接程序ld自预编译目标模块生成的,这些模块可在执行开始后联编到可执行文件中。
动态库的另一功能是模块可以为系统中其它正在执行的程序使用,而无需在每个程序的内存中复制模块。
鉴于此原因,动态库也是共享库。
动态库提供下列功能:■链接程序在编译链接过程中并不将目标模块联编到可执行文件中;此种联编被推迟 到了运行时。
■共享库模块在第一个运行程序引用它时联编到系统内存中。
如果有任何后续运行程 序引用它,会将该引用映射到上述第一个副本。
■使用动态库,程序维护变得更加容易。
一旦在系统中安装了已更新的动态库,无需 重新链接可执行文件便会立即影响使用它的所有应用程序。
权衡动态库 动态库引入了其它一些权衡考虑因素:■a.out文件更小 将库例程联编推迟到运行时意味着可执行文件的大小要小于同等意义上调用库静态版本的可执行文件;该可执行文件不包含库例程的二进制文件。
■进程占用的内存可能更少当使用库的若干进程同时处于活动状态时,仅有库的一个副本驻留在内存中,为所有进程所共享。
■有可能增加系统开销运行时加载和链接编辑库例程需要额外的处理器时间。
另外,库中与位置无关的编码可能要比静态库中可重定位的编码执行得更慢。
■有可能提高系统总体性能提高库共享可减少内存占用,其结果将会改善系统的总体性能(减少了内存交换时的I/O访问时间)。
各程序间的性能特征随程序的不同会有很大变化。
并非总能预先判断或估计动态库与静态库相比性能会提高(还是降低)。
但是,如果所需库的这两种形式对您都可用,则分别评估一下程序使用每个库时的性能还是很值得的。
第4章库4-13 4.5.2 4.5.3 4.5.3.14.5.3.24.5.3.3 位置无关代码和–xcode 可以将与位置无关的代码(PIC)联编到程序中的任何地址,而无需由链接编辑器进行重定位。
从固有性质出发,此类代码可以在同时发生的进程间共享。
因而,如果要生成动态共享库,必须使用-xcode编译器选项将组成例程编译成与位置无关的。
在与位置无关的代码中,对全局项的每一引用均会通过全局偏移表中的指针编译为某一引用。
每个函数调用均会通过过程链接表以相对编址模式进行编译。
在SPARC处理器上,全局偏移表的大小限制为8K字节。
编译器标志-xcode=v用于指定二进制对象的代码地址空间。
使用该标志,不但可以生成32、44或64位绝对地址,而且可生成大小不同模型与位置无关的代码。
(xcode=pic13等价于传统的-pic标志,-xcode=pic32等价于-PIC。
)–xcode=pic32编译器选项与–xcode=pic13类似,但允许全局偏移表跨越32位地址范围。
有关详细信息,参见f95
(1)手册页或《Fortran用户指南》。
联编选项 可以在编译时指定动态或静态库联编。
这些选项实际上是链接程序选项,但它们是由编译器识别并传递给链接程序的。
–Bdynamic|–Bstatic –Bdynamic用于在各种可能的情况下为共享动态联编设置首选项。
–Bstatic将联编只限制于静态库。
当库的静态和动态版本都可用时,使用该选项在命令行首选项间进行切换: f95prog.f–Bdynamic–lwells–Bstatic–lsurface –dy|–dn 允许或不允许对整个可执行文件进行动态链接。
(该选项只能在命令行上出现一次。
)–dy允许链接动态共享库。
–dn不允许链接动态库。
64位环境中的联编 某些静态系统库(如libm.a和libc.a)不可以在64位Solaris操作环境中使用。
这些库只作为动态库提供。
在这些环境中使用-dn将会导致错误,指示缺少某些静态系统库。
另外,如果编译器命令行以-Bstatic结尾,其结果将是一样的。
4-14Fortran编程指南•2004年4月 4.5.44.5.5 要与特定库的静态版本进行链接,请使用类似下面的命令行:f95-oprogprog.f-Bstatic-labc-lxyz-Bdynamic 在此,链接的是用户的libabc.a和libxyz.a文件(而不是libabc.so或libxyz.so),最后的-Bdynamic确保以动态方式链接包括系统库在内的其余各库。
在更复杂的情况下,可能必须在链接阶段根据需要用相应的-Bstatic或-Bdynamic显式引用每个系统库和用户库。
首先使用设置为’-Dfiles’的LD_OPTIONS获得全部所需库的列表。
然后用-nolib执行链接步骤(禁止自动链接系统库)并显式引用所需的库。
例如: f95-xarch=v9-ocdf-nolibcdf.o-Bstatic-lsunmath\-Bdynamic-lm-lc 命名惯例 为符合链接加载程序和编译器假定的动态库命名惯例,请为您使用前缀lib和后缀.so创建的动态库命名。
例如,编译器选项–lmyfavs可以引用libmyfavs.so。
链接程序还接受可选的版本号后缀:例如,libmyfavs.so.1代表库的第一版。
编译器的–hname选项将name记录为正在生成的动态库的名称。
一个简单动态库 生成动态库需要用–xcode选项和链接程序选项–
G、–ztext和–hname编译源文件。
这些链接程序选项可通过编译器命令行来提供。
您可以用静态库示例中使用的相同文件创建一个动态库。
示例:用–pic和其它链接程序选项编译: demo%f95–olibtestlib.so.1–G–xcode=pic13–ztext\–hlibtestlib.so.1*.f –G告知链接程序生成一个动态库。
–ztext会在发现与位置无关的代码以外的任何内容(如可重定位文本)时发出警告。
第4章库4-15 4.5.6 示例:使用动态库生成可执行文件a.out: demo%f95–otrylib-R‘pwd‘trylib.flibtestlib.so.1demo%filetrylibtrylib:ELF32位MSB可执行SPARC版本
1,已动态链接,未剥离demo%lddtrylib libtestlib.so.1=>/export/home/U/Tests/libtestlib.so.1libfui.so.1=>/opt/SUNWspro/lib/libfui.so.1libfai.so.1=>/opt/SUNWspro/lib/libfai.so.1libc.so.1=>/usr/lib/libc.so.1 注意,此示例使用-R选项将动态库路径(当前目录)联编到可执行文件中。
file命令显示可执行文件是以动态方式链接的。
初始化公共块 生成动态库时,通过将已初始化的公共块集合到同一库中并在其它所有库之前引用该库,确保正确初始化公共块(用DATA或BLOCKDATA表示的块)。
例如: demo%f95-G-xcode=pic32-oinit.soblkdat1.fblkdat2.fblkdat3.fdemo%f95-oprogmain.finit.sootherlib1.sootherlib2.so 首次编译会由定义公共块并在BLOCKDATA单元中对其进行初始化的文件创建一个动态库。
第二次编译创建可执行二进制文件,将已编译的主程序与应用程序所需的动态库链接起来。
注意,初始化所有公共块的动态库在其它所有库之前首先出现。
这样将确保正确地初始化这些块。
4-16Fortran编程指南•2004年4月 4.64.7 随SunFortran编译器提供的库 下表展示了随编译器一同安装的库。
表4-
1 随编译器提供的主要库 库 f95内在支持f95接口f95数组内在库f95区间运算内在库Sun数学函数库 名称 libfsulibfuilibf*ailibifailibsunmath 所需选项 无无无-xinterval无 可发送库 如果您的可执行文件使用了runtime.libraries自述文件中列出的某个Sun动态库,则您的许可证包括将该库重新分发给客户的权利。
该自述文件位于READMEs目录:/opt/SUNWspro/READMEs/ 请勿以任何形式重新分发或透露头文件、源代码、目标模块或目标模块的静态库。
有关更多详细信息,请参阅您的软件许可证。
第4章库4-17 4-18Fortran编程指南•2004年4月 第5章 程序分析和调试 本章介绍了许多有利于程序分析和调试的编译器功能。
5.1 5.1.1 全局程序检查(-Xlist) –Xlist选项为分析源程序中的不一致性及可能存在的运行时问题提供了一条颇有价值的途径。
编译器执行的分析是全局性的,跨越各个子程序。
–Xlist报告子程序变量、公共块、参数在对齐、数值与类型一致性方面的错误,以及其它各种错误。
-Xlist还可用来生成详细的源代码列表和交叉引用表。
用-Xlist选项编译的程序会自动将其分析数据内置于二进制文件中。
这样便能对库中的程序执行全局程序检查。
GPC概述 全局程序检查(GPC)(由-Xlistx选项调用)执行下列任务:■比通常更为严格地强制执行Fortran类型检查规则,特别是在单独编译的例程之间■强制执行在不同机器或操作系统之间转移程序所需的一些可移植性限制■检测仍有可能未达到最佳或易于出错的合法构造■揭示其它潜在的错误和含混不清之处特别地,全局检查会报告如下问题:■接口问题 ■伪参数和实参数的数量与类型间的冲突 5-
1 5.1.2 5.1.2.1 ■函数值的错误类型■因不同子程序间公共块中的数据类型不匹配而引起的可能冲突■使用问题■用作子例程的函数或用作函数的子例程■已声明但未使用的函数、子例程、变量以及标签■已引用但未声明的函数、子例程、变量以及标签■未设置变量的使用■执行不到的语句■隐式类型变量■已命名公共块的长度、名称和布局的不一致性 如何调用全局程序检查 命令行中的-Xlist选项用于调用编译器的全局程序分析器。
该选项有许多子选项,分别在以下各部分进行说明。
示例:为基本全局程序检查编译以下三个文件: demo%f95–Xlistany1.fany2.fany3.f 在上述示例中,编译器:■在文件any1.lst中产生输出列表■在无错误时编译并链接程序 屏幕输出 通常会将-Xlistx产生的输出列表写到文件中。
要直接显示到屏幕上,请使用-Xlisto将输出文件写到/dev/tty。
示例:显示到终端: demo%f95–Xlisto/dev/ttyany1.f 5.1.2.2 缺省输出功能 -Xlist选项提供了可用于输出的功能组合。
不使用其它-Xlist选项,缺省情况下会获得以下结果:■列表文件名取自出现的第一个输入源文件或目标文件,同时扩展名代之以.lst■编有行号的源码列表 5-2Fortran编程指南•2004年4月 5.1.2.3 ■描述例程间不一致性的错误消息(嵌入在列表中)■标识符的交叉引用表■以每页66行、每行79列编页码■无调用图■不扩展include文件 文件类型 检查进程可识别编译器命令行中以.f、.f90、.f95、.for、.F、.F95或.o结尾的所有文件。
.o文件仅向进程提供与全局名称(如子例程和函数名)有关的信息。
第5章程序分析和调试5-
3 5.1.3 -Xlist和全局程序检查的一些示例 此处列出了下列示例中使用的Repeat.f源代码: demo% catRepeat.fPROGRAMrepeatpn1=27.005CALLsubr1(pn1)CALLnewf(pn1)PRINT*,pn1END SUBROUTINEsubr1(x)IF(x.GT.1.0)THENCALLsubr2(x*0.5)ENDIF END SUBROUTINEnewf(ix)INTEGERPRNOKIF(ix.eq.0)THENix=-1ENDIFPRINT*,prnok(ix) END INTEGERFUNCTIONprnok(x)prnok=INT(x)+.05 END SUBROUTINEunreach_sub()CALLsleep
(1) END SUBROUTINEsubr2(x)CALLsubr1(x+x) END 5-4Fortran编程指南•2004年4月 示例:使用-XlistX显示错误、警告和交叉引用 demo%f95-XlistXRepeat.f demo%catRepeat.lst Repeat.f 2002年3月18日星期一18:08:27 第1页 文件"Repeat.f"程序repeat
4 CALLnewf(pn1) ^ ****ERR#418:参数"pn1"是real,但伪参数是integer参见:"Repeat.f"第14行
5 PRINT*,pn1 ^ ****ERR#570:变量"pn1"作为real引用但在下行被设置为第4行 子例程newf 19 PRINT*,prnok(ix) ^ ****ERR#418:参数"ix"是integer,但伪参数是real参见:"Repeat.f"第22行 函数prnok 23 prnok=INT(x)+.05 ^ ****WAR#1024:"real*4"类型的值赋值给"integer*4"类型的变量是可疑的 子例程unreach_sub 26 SUBROUTINEunreach_sub() ^ ****WAR#338:子例程"unreach_sub"从未自程序中调用子例程subr2 31 CALLsubr1(x+x) ^ ****WAR #348:"subr1"的递归调用。
请参阅动态调用:"Repeat.f"第10行"Repeat.f"第3行 integer 交叉引用 2002年3月18日星期一18:08:27第2页 交叉引用表源文件:Repeat.f 第5章程序分析和调试5-
5 图例:DUMACIENL 定义/声明简单使用修改的事件实际参数子例程/函数调用初始化:数据或扩展声明EQUIVALENCE中事件NAMELIST中事件使用模块 交叉引用程序形式 程序------- repeat交叉引用 2002年3月18日星期一15:40:57 第3页
D 1:
D 2002年3月18日星期一15:40:57 第4页 函数和子例程------------------------- INT 固有
C newf
C
D prnokint*4
C
D
C subr2
C
D unreach_sub
14:D 15:D22:
D C 3:C8:D31:C 10:C30:
D D 19:C23:M27:C 26:
D 5-6Fortran编程指南•2004年4月 交叉引用 2002年3月18日星期一15:40:57第5页 变量和数组-------------------- ix int*4伪参数
D 16:
U 17:
M 19:
A pn1 real*4
M 3:
A 4:
A 5:
U x real*4伪参数
D 9:
U 10:
U DU 30:
D 31:
U 31:
U DA 22:
D 23:
A ------------------------------------------------------------------- 统计 2002
年3月18日星期一15:40:57第6页 日期:选项:文件:行:例程:消息: 2002年3月18日星期一15:40:57 -XlistX2(源:1;库:1) 33(源:33;库子程序:1)6(MAIN:1;子例程:4;函数:1)6(错误:3;警告:3) 5.1.4 5.1.4.1 跨例程全局检查的子选项 基本的全局交叉检查选项是不带子选项的-Xlist。
它是子选项的组合,其中的每一项都可以单独指定。
以下部分介绍用于产生列表、错误或交叉引用表的选项。
命令行中可以出现多个子选项。
子选项语法 按下列规则添加子选项:■将子选项添加到-Xlist的末尾。
■不要在-Xlist和子选项间置入空格。
第5章程序分析和调试5-
7 5.1.4.2 ■每个-Xlist只使用一个子选项。
-Xlist及其子选项 按下列规则合并子选项:■最常用的选项是-Xlist(列表、错误、交叉引用表)。
■使用-Xlistc、-XlistE、-XlistL或-XlistX可以合并特定的功能。
■其它子选项进一步指定其它细节。
示例:以下两个命令行中的每一个执行相同的任务: demo%f95–Xlistc–Xlistany.f demo%f95-Xlistcany.f 下表展示单独由这些基本的-Xlist子选项生成的报告: 表5-
1 基本的Xlist子选项 生成的报告 错误、列表、交叉引用仅错误仅错误以及源码列表仅错误以及交叉引用表仅错误以及调用图 选项 –Xlist–XlistE–XlistL–XlistX–Xlistc 5-8Fortran编程指南•2004年4月 下表展示所有-Xlist子选项。
表5-
2 -Xlist子选项的完整列表 选项 -Xlist(无子选项)-Xlistc -XlistE-Xlisterr[nnn]-Xlistf-Xlisth-XlistI -XlistL-Xlistln 操作 显示错误、列表和交叉引用表 显示调用图和错误单独使用时,-Xlistc不显示列表或交叉引用。
它使用可打印字符以树的形式产生调用图。
如果某些子例程未自MAIN中调用,会显示一个以上的图。
单独打印每一个BLOCKDATA,不连接到MAIN。
缺省时不显示调用图。
显示错误单独使用时,-XlistE只显示跨例程错误而不显示列表或交叉引用。
在检验报告中禁止错误nnn可使用-Xlisterr禁止来自列表或交叉引用的编号错误信息。
例如:-Xlisterr338禁止错误消息338。
要禁止其它特定的错误,可重复使用该选项。
如果未指定nnn,会禁止所有错误消息。
更快地产生输出可使用-Xlistf产生源文件列表和交叉检查报告,并在未完全编译的情况下检查源码。
显示来自交叉检查停止编译的错误使用-Xlisth,如果在交叉检查程序时检测到错误,编译将会停止。
此时,会将报告重定向到stdout而非*.lst文件。
列表和交叉检查include文件如果-XlistI是唯一使用的子选项,会随-Xlist标准输出(行编号列表、错误消息和交叉引用表)一同显示或扫描include文件。
列表—如果未禁止列表,则会在适当位置列出include文件。
文件会按其被包含的次数列出。
这些文件是:源文件、#include文件、INCLUDE文件交叉引用表—如果未禁止交叉引用表,会在生成交叉引用表时扫描下列所有文件:源文件、#include文件、INCLUDE文件缺省时不显示include文件。
显示列表和错误使用-XlistL仅产生列表和跨例程错误列表。
该子选项本身并不显示交叉引用表。
缺省时显示列表和交叉引用表 设置分页符可使用-Xlistl将页长度设置为缺省页面大小以外的值。
例如,-Xlistl45将页长度设置为45行。
缺省值是66。
如果令n=0(-Xlistl0),该选项将显示不带分页符的列表和交叉引用,以便于屏幕查看。
第5章程序分析和调试5-
9 表5-
2 -Xlist子选项的完整列表(续下) 选项 -XlistMP-Xlistoname-Xlistsn -Xlistw[nnn]-Xlistwar[nnn]-XlistX 操作 检查OpenMP指令的一致性可使用-XlistMP报告源代码文件中指定的OpenMP指令的不一致性。
有关详细信息,另请参见《OpenMPAPI用户指南》。
指定-Xlist输出报告文件可使用-Xlisto指定生成的报告输出文件。
(在o和name之间必须有一个空格。
)使用-Xlistoname,将会输出到name而不是file.lst。
要直接显示到屏幕上,请使用以下选项:-Xlisto/dev/tty 禁止交叉引用中未引用的符号可使用-Xlists在交叉引用表中禁止include文件中已定义但源文件中未引用的任何标识符。
如果使用了子选项-XlistI,该子选项将不起作用。
缺省时不显示
声明:
该资讯来自于互联网网友发布,如有侵犯您的权益请联系我们。