我正在编译需要一些库的C++程序。这些库的代码是用Fortran编写的,并包含COMMON块。基本上我正在做类似的事情:

g++ -o main.cpp main lib1.a lib2.a

Lib1.a和lib2.a用Fortran编码:
gfortran -c -o lib1.a Code1.F
gfortran -c -o lib2.a Code2.F

两者都包含一个包含以下内容的头文件:
double precision var1,var2
double precision var3,var4

common /block1/ var1,var2
common /block2/ var3,var4

COMMON块似乎出了点问题。例如,在公共(public)变量之后更改变量的顺序,或添加新变量,将导致随机不一致的结果。

我知道在可能的情况下不应该使用COMMON语句,但是在这种情况下我看不出有什么问题。

最佳答案

根据您的编译器Fortran的不同,它可能在变量之间插入填充。也许Fortran和C++编译器对此持不同意见。只是一个猜测。

如果您愿意更改Fortran代码,则使用ISO C绑定(bind)将有所帮助,因为它会指示Fortran编译器生成与C编译器的约定一致的代码。 http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/fortran/lin/compiler_f/bldaps_for/common/bldaps_interopc.htm有一个常见的块示例。根据该示例:

use, intrinsic :: iso_c_binding
real (c_double) :: var1, var2, var3, var4
common /block1/ var1, var2
common /block2/ var3, var4
bind (C) :: /block1/, /block2/

如果您愿意进行进一步的修改,则更好的选择是模块变量。这样就不必担心内存中的布局。
module global_vars
use, intrinsic :: iso_c_binding
real (c_double), bind (C) :: var1, var2, var3, var4
end module global_vars

关于c++ - 使用COMMON语句编译包括Fortran库在内的C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11016266/

10-17 00:31