【问题标题】:gfortran: multiple definitions of... first defined heregfortran:多个定义...首先在这里定义
【发布时间】: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


【解决方案1】:

这是@dave_thompson_085 在他的 cmets 中给出的答案,似乎可以解决问题。

首先,我假设你的第一个命令应该有-c,你的前两个应该有.f90(或.f95或类似的)后缀,否则编译器不应该为它们做任何事情。其次,-o -fbounds-check maincode(在没有-c的情况下)表示将链接的输出放在文件-fbounds-check中,并在链接的文件中包含maincode(如果存在)。由于您已经将所有例程链接到 maincode,因此再次链接这些相同的例程加上 maincode 会产生重复。

至少将-fbounds-check 移动到-o 之前;更好的是,将影响解析和代码生成的选项也放在源文件之前是通常的样式(尽管不是必需的),在您的示例中是maincode.f90。另请注意,这只会为 maincode 中的例程生成绑定检查;如果其他例程中有任何下标错误,则不会被捕获。当您在编译语言中遇到错误时,检测到问题的地方可能不是真正的根源,通常最好将调试选项应用到所有可能的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2021-02-22
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多