【问题标题】:Fortran - Cannot IMPORT `c_char` from host scoping unitFortran - 无法从主机范围单元导入“c_char”
【发布时间】:2018-03-13 14:04:24
【问题描述】:

我有一个用 Fortran(固定格式源)编写的程序,我需要将它与一个用 C++ 编写的库链接。我的程序和库都使用 MPI,所以我使用的是 mpif90 编译器。我有一个简短的接口 interface.inc 包含到库的绑定,所以我可以在我的程序中调用它的函数。

问题是,我无法编译我的代码,因为一个奇怪的错误:

/projects/test/meric/include/meric.inc:11:22:

   IMPORT :: C_CHAR
                  1
Error: Cannot IMPORT ‘c_char’ from host scoping unit at (1) - does not exist.
/projects/test/meric/include/meric.inc:12:21:

   CHARACTER(KIND=C_CHAR), DIMENSION(*) :: reg_name
                 1
Error: Parameter ‘c_char’ at (1) has not been declared or is a variable, which does not reduce to a constant expression
header.h:9:19:

   implicit none
               1
Error: IMPLICIT NONE statement at (1) cannot follow INTERFACE statement at (2)
x_solve.f:51:44:

   INTERFACE_START( x_slv , "x_solve" )

正如我们在我的代码的以下 sn-ps 中看到的,应该使用 ISO_C_BINDINGS 模块提供 C_CHAR 类型:

主程序:

       program BT
       USE, INTRINSIC :: ISO_C_BINDING
       include 'header.h'
#include "interface.inc"

interface.h:

  INTERFACE
  SUBROUTINE FuncA() BIND(c,NAME='FuncA')
  END SUBROUTINE FuncA
  SUBROUTINE FuncB(param_name) BIND(c,NAME='FuncB')
  IMPORT :: C_CHAR
  CHARACTER(KIND=C_CHAR), DIMENSION(*) :: param_name
  END SUBROUTINE FuncB
  END INTERFACE

header.h

c---------------------------------------------------------------------
c---------------------------------------------------------------------
c
c  header.h
c
c---------------------------------------------------------------------
c---------------------------------------------------------------------

      implicit none

c---------------------------------------------------------------------
c The following include file is generated automatically by the
c "setparams" utility. It defines 
c      problem_size:  maximum overall grid size
c      dt_default:    default time step for this problem size if no
c                     config file
c      niter_default: default number of iterations for this problem size
c---------------------------------------------------------------------

      include 'npbparams.h'

      integer           aa, bb, cc, BLOCK_SIZE
      parameter        (aa=1, bb=2, cc=3, BLOCK_SIZE=5)

      integer           npb_verbose
      double precision  elapsed_time
      logical           timeron
      common /global/   elapsed_time, npb_verbose, timeron

      double precision  tx1, tx2, tx3, ty1, ty2, ty3, tz1, tz2, tz3, 
     >                  dx1, dx2, dx3, dx4, dx5, dy1, dy2, dy3, dy4, 
     >                  dy5, dz1, dz2, dz3, dz4, dz5, dssp, dt, 
     >                  ce(5,13), dxmax, dymax, dzmax, xxcon1, xxcon2, 
     >                  xxcon3, xxcon4, xxcon5, dx1tx1, dx2tx1, dx3tx1,
     >                  dx4tx1, dx5tx1, yycon1, yycon2, yycon3, yycon4,
     >                  yycon5, dy1ty1, dy2ty1, dy3ty1, dy4ty1, dy5ty1,
     >                  zzcon1, zzcon2, zzcon3, zzcon4, zzcon5, dz1tz1, 
     >                  dz2tz1, dz3tz1, dz4tz1, dz5tz1, dnxm1, dnym1, 
     >                  dnzm1, c1c2, c1c5, c3c4, c1345, conz1, c1, c2, 
     >                  c3, c4, c5, c4dssp, c5dssp, dtdssp, dttx1,
     >                  dttx2, dtty1, dtty2, dttz1, dttz2, c2dttx1, 
     >                  c2dtty1, c2dttz1, comz1, comz4, comz5, comz6, 
     >                  c3c4tx3, c3c4ty3, c3c4tz3, c2iv, con43, con16

      common /constants/ tx1, tx2, tx3, ty1, ty2, ty3, tz1, tz2, tz3,
     >                  dx1, dx2, dx3, dx4, dx5, dy1, dy2, dy3, dy4, 
     >                  dy5, dz1, dz2, dz3, dz4, dz5, dssp, dt, 
     >                  ce, dxmax, dymax, dzmax, xxcon1, xxcon2, 
     >                  xxcon3, xxcon4, xxcon5, dx1tx1, dx2tx1, dx3tx1,
     >                  dx4tx1, dx5tx1, yycon1, yycon2, yycon3, yycon4,
     >                  yycon5, dy1ty1, dy2ty1, dy3ty1, dy4ty1, dy5ty1,
     >                  zzcon1, zzcon2, zzcon3, zzcon4, zzcon5, dz1tz1, 
     >                  dz2tz1, dz3tz1, dz4tz1, dz5tz1, dnxm1, dnym1, 
     >                  dnzm1, c1c2, c1c5, c3c4, c1345, conz1, c1, c2, 
     >                  c3, c4, c5, c4dssp, c5dssp, dtdssp, dttx1,
     >                  dttx2, dtty1, dtty2, dttz1, dttz2, c2dttx1, 
     >                  c2dtty1, c2dttz1, comz1, comz4, comz5, comz6, 
     >                  c3c4tx3, c3c4ty3, c3c4tz3, c2iv, con43, con16

      double precision cuf(0:problem_size),  q(0:problem_size),
     >                 ue(0:problem_size,5), buf(0:problem_size,5)
      common /work_1d/ cuf, q, ue, buf
!$OMP THREADPRIVATE(/work_1d/)

      integer   max_zones
      parameter (max_zones=x_zones*y_zones)
      integer   x_start(x_zones), x_end(x_zones), x_size(x_zones),
     >          y_start(y_zones), y_end(y_zones), y_size(y_zones),
     >          iz_west (max_zones), iz_east (max_zones),
     >          iz_south(max_zones), iz_north(max_zones)
      common /zones/ x_start, x_end, x_size, y_start, y_end, y_size,
     >               iz_west, iz_east, iz_south, iz_north

      dimension start1(max_zones), start5(max_zones),
     $          qstart_west (max_zones), qstart_east (max_zones),
     $          qstart_south(max_zones), qstart_north(max_zones)
      common /array_start/ start1, start5, qstart_west, qstart_east,
     $                     qstart_south, qstart_north, qoffset


c-----------------------------------------------------------------------
c   Timer constants
c-----------------------------------------------------------------------
      integer t_rhsx,t_rhsy,t_rhsz,t_xsolve,t_ysolve,t_zsolve,
     >        t_rdis1,t_rdis2,t_add,
     >        t_rhs,t_last,t_total
      parameter (t_total = 1)
      parameter (t_rhsx = 2)
      parameter (t_rhsy = 3)
      parameter (t_rhsz = 4)
      parameter (t_rhs = 5)
      parameter (t_xsolve = 6)
      parameter (t_ysolve = 7)
      parameter (t_zsolve = 8)
      parameter (t_rdis1 = 9)
      parameter (t_rdis2 = 10)
      parameter (t_add = 11)
      parameter (t_last = 11)

meric.inc

  USE, INTRINSIC :: ISO_C_BINDING

  INTERFACE
  SUBROUTINE MERIC_Init() BIND(c,NAME='MERIC_Init')
  END SUBROUTINE MERIC_Init
  SUBROUTINE MERIC_Close() BIND(c,NAME='MERIC_Close')
  END SUBROUTINE MERIC_Close
  SUBROUTINE MERIC_IgnoreStart() BIND(c,NAME='MERIC_IgnoreStart')
  END SUBROUTINE MERIC_IgnoreStart
  SUBROUTINE MERIC_IgnoreStop() BIND(c,NAME='MERIC_IgnoreStop')
  END SUBROUTINE MERIC_IgnoreStop
  SUBROUTINE MERIC_MeasureStart(reg_name) BIND(c,NAME='MERIC_MeasureStart')
  IMPORT :: C_CHAR
  CHARACTER(KIND=C_CHAR), DIMENSION(*) :: reg_name
  END SUBROUTINE MERIC_MeasureStart
  SUBROUTINE MERIC_MeasureStop() BIND(c,NAME='MERIC_MeasureStop')
  END SUBROUTINE MERIC_MeasureStop
  END INTERFACE

你知道为什么C_CHAR 没有从ISO_C_BINDINGS 导入吗?


然后我尝试了另一种方式来编译程序:

主程序:

       module tmp
#include "interface.inc"
       end module tmp

       program BT
c---------------------------------------------------------------------
       USE tmp
#include "header.h"

但是现在,代码返回以下错误:

header.h:9:19:

       implicit none
                   1
Error: IMPLICIT NONE statement at (1) cannot follow INTERFACE statement at (2)

上面提到的implicit none语句在header.h开头,但是接口本身是封装在程序外的模块中的。

导致冲突的原因是什么?

当我从header.h 中删除implicit none 语句时,程序会编译,但我想了解这里发生了什么。


编辑

添加了源代码。

【问题讨论】:

  • interface.inc 还是 interface.h ?您是否在使用 #include 而不是 Fortran 中的 include 语句时运行预处理器。
  • 我们缺少header.h 的代码。鉴于那里报告了错误,这是相当不幸的。
  • 与其乱七八糟的头文件,不如用一个简短但完整的单一源来证明问题?我尝试根据您在此处显示的内容构建一个,并且它在 Intel Fortran 中编译得很好(我这里没有 gfortran)。我怀疑当你这样做时,你会自己找出问题所在。我也同意根据您在此处显示的内容使用#include 没有任何好处。
  • @VladimirF 很抱歉不够清晰 - 我已经添加了剩余的源文件。
  • @SteveLionel 我会尝试做,但恐怕不是那么容易 - 我要编译的软件非常老旧且包含许多模块,所以我不是我肯定能重建这个案子。

标签: compiler-errors compilation fortran gfortran


【解决方案1】:

有趣的是,错误发生在 meric.inc 中并且该文件未在问题中列出。还显示了interface.h 的来源,但包含的文件是“header.handinterface.inc”。

有几种方法可以隐藏C_CHAR 出现的错误语句。

  1. 它可能在接口体中的接口体中。外部接口体可能认为它不需要C_CHAR,因此不导入它,但内部接口体没有它可用于导入。
  2. 如果在包含文件的某处有 USE 语句,读取

    use ISO_C_BINDING, only: surprise_me => C_CHAR
    

然后这会隐藏C_CHAR 的名称,即使在没有上述声明的情况下可以访问该名称。

【讨论】:

  • 非常感谢您的回答!我已在问题中添加了丢失的文件,因此您可以根据需要扩展您的答案。
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2019-11-25
  • 2017-10-23
  • 2020-06-06
相关资源
最近更新 更多