在共享库中包含 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
设置断点时
,我可以打印每个断点的地址。地址不一样。mainp
sharedf
ivar
从行为看来,GNU ld 没有正确匹配_whgc_
符号,但我不清楚在共享库构建或最终链接中传递哪些选项以使其这样做?
(请不要建议公共块的替代品。在我的实际应用程序中,我正在处理使用公共块的遗留代码。)
编辑:
我在 Linux/x86 上尝试了我的示例,并且行为是正确的。当然,在 Linux 上,共享库和可执行文件是 ELF 格式的对象,而在 Windows/MinGW 上,格式是 PE/COFF。