4

在共享库中包含 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_

这是_whgc_mainp.exe 中唯一的符号。

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

从行为看来,GNU ld 没有正确匹配_whgc_符号,但我不清楚在共享库构建或最终链接中传递哪些选项以使其这样做?

(请不要建议公共块的替代品。在我的实际应用程序中,我正在处理使用公共块的遗留代码。)

编辑:

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

4

0 回答 0