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