Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 共享库中的命名公共块_Windows_Fortran_Shared Libraries_Linker Errors_Fortran Common Block - Fatal编程技术网

Windows 共享库中的命名公共块

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

我在使用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中唯一的
\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上跨动态库边界访问它们。这是同样的说法。