【发布时间】:2015-04-28 05:07:53
【问题描述】:
我的代码在我要链接的单独文件中包含主程序和许多模块。目前我有一个为每个模块创建 .o 文件的生成文件(一个在单独的行上),然后我将它们放在一起,例如这里:
mpif90 - modutils
mpif90 -c modvarsym
mpif90 -c s1_Phi.f90
mpif90 -c s2_Lambda.f90
mpif90 maincode.f90 modutils.o modvarsym.o s1_Phi.o s2_Lambda.o -o maincode
上面的编译很好并且运行正常 - 除了我怀疑我怀疑我的变量中有数组绑定问题。所以我包括 -fbounds-check maincode 语句,例如这里:
mpif90 maincode.f90 modutils.o modvarsym.o s1_Phi.o s2_Lambda.o -o -fbounds-check maincode
此时出现大量“多重定义”错误,代码将不再编译。我想这是因为 -fbounds-check: 而不是仅仅启用检查数组边界,它可能会进行一些额外的检查。我还怀疑错误在于我在make文件中输入文件的方式。但是我找不到可行的方法。在这些文件中,主代码和其他两个模块都使用了 modvarsym 和 modutils。主代码使用所有四个模块。 这些文件中没有包含语句。 Maincode 是唯一带有程序语句的文件,变量在 modvarsym 中只声明一次。总的来说,代码在没有 -fbounds-check 的情况下编译和运行。但是我真的很想使用 -fbounds-check 来确保数组不会溢出。有人能把我放在正确的轨道上吗?谢谢。
【问题讨论】:
-
首先,我假设你的第一个命令应该有
-c,你的前两个应该有.f90(或.f95或类似的)后缀,否则编译器不应该为他们做任何事。其次,-o -fbounds-check maincode(在没有-c的情况下)表示将链接的输出放在文件-fbounds-check中,并在链接的文件中包含maincode(如果存在)。由于您已经将所有例程链接到maincode,因此再次链接这些相同的例程加上主代码会产生重复项。 ... -
... 至少将
-fbounds-check之前移动到-o;更好的是,将影响解析和代码生成的选项也放在源文件之前是通常的样式(尽管不是必需的),在您的示例中是maincode.f90。另请注意,这只会为 maincode 中的例程生成绑定检查;如果其他例程中有任何下标错误,则不会被捕获。当您在编译语言中遇到错误时,检测到问题的地方可能不是真正的根源,通常最好将调试选项应用到所有可能的地方。 -
非常感谢。在 -o 之前移动 -fbounds-check 解决了编译问题。
标签: fortran fortran90 gfortran