Windows 共享库中的命名公共块
我在使用Fortran时遇到了一个问题 共享库中的子例程。这个子程序有一个 命名公共块 我有一个Fortran主程序,它使用这个公共块 以及与共享库的链接 其行为是在公共块中设置变量 子例程或主程序不在 两个 我正在windows上的MinGW下使用gfortran 4.9.3。这是我的作品 我的例子很简单 主程序:Windows 共享库中的命名公共块,windows,fortran,shared-libraries,linker-errors,fortran-common-block,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 sha
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中唯一的\u whgc\u
符号
但是,当我在gdb中运行mainp.exe
并在这两个文件中设置断点时
mainp
和sharedf
,我可以在每个断点打印ivar
的地址。地址
它们不一样
从行为上看,GNU ld似乎不正确
匹配\u whgc\u
符号,但我不清楚是什么选项
在共享库生成中传递或传递到的最终链接
让它这样做
(请不要建议普通街区的替代方案。在我的真实生活中
应用程序我正在处理使用公共块的遗留代码。)
编辑:
我在Linux/x86上尝试了我的示例,结果表明行为是正确的。
当然,在Linux上,共享库和可执行文件是ELF格式的
对象,在Windows/MinGW上,格式为PE/COFF。是的,我尝试过,但收到以下警告消息:f951.exe:warning:-fPIC忽略目标(所有代码都与位置无关)。我在英特尔x86芯片组上使用32位编译器。而且,正如警告中所预期的,运行时行为是相同的。在Windows上,您可能需要按照所述显式导出/导入公共块。我查看了您指向我的链接,但不理解为什么它与我的特定问题相关。我正在使用gfortran,从我的nm实验来看,公共块似乎正在导出。您可以更具体一点吗?该链接基本上说,您需要将公共块显式标记为dllimport/export,以便在Windows上跨动态库边界访问它们。这是同样的说法。