共享库中命名的公共块

时间:2017-01-05 18:18:40

标签: windows fortran shared-libraries linker-errors fortran-common-block

当我包含Fortran时遇到问题 共享库中的子例程。这个子程序有一个 命名共同块。

我有一个使用这个公共块的Fortran主程序 以及与共享库的链接。

行为是公共块中的变量设置 子程序或主程序之间不共享 两个。

我在Windows上的MinGW下使用gfortran 4.9.3。这是件 我的一个非常简单的例子。

主程序:

  program mainp
  common/whgc/ivar
  ivar = 23
  call sharedf
  end

子程序:

  subroutine sharedf
  common/whgc/ivar
  print *, 'ivar=', ivar
  end

生成文件:

FC = gfortran
FFLAGS=-g

all: shltest.dll mainp.exe

shltest.dll: sharedf.o
    $(FC) -shared -o  shltest.dll sharedf.o

mainp.exe: mainp.o shltest.dll
    $(FC) -o mainp.exe mainp.o shltest.dll

clean:
    rm *.o mainp.exe shltest.dll

运行mainp.exe时,会生成ivar = 0而不是正确的ivar=23 以下是我使用nm进行的一些实验的结果。

nm -g mainp.o shows:
...
 00000004 C _whgc_
 nm on sharedf.o shows the same.
 nm -g shltest.dll shows:
 ...
 71446410 B _whgc_
 nm -g mainp.exe shows:
 ...
 00406430 B _whgc_

这是mainp.exe中唯一的_whgc_符号。

但是,当我在gdb中运行mainp.exe并在两者中设置断点时 mainpsharedf,我可以在每个断点处打印ivar的地址。地址 不一样。

从行为来看,似乎很明显GNU ld不正确  匹配_whgc_符号,但我不清楚哪些选项  传递共享库构建或最终链接  让它这样做?

(请不要建议公共区块的替代方案。在我的真实情况中  应用程序我正在处理使用公共块的遗留代码。)

编辑:

我在Linux / x86上试过我的例子,行为是正确的。 当然在Linux上,共享库和可执行文件是ELF格式 对象和Windows / MinGW格式为PE / COFF。

0 个答案:

没有答案