的Fortran“参数”类型未包含在编译后的对象(Fortran 'parameter

2019-07-19 05:54发布

我有一个包含一些变量有属性的Fortran语言模块parameter ,部分属性save 。 该parameter的人不包括在编译对象,试图组装一个库时成为一个问题。 例如,考虑一个文件testModule.f90

module testMOD
  integer, save :: thisIsSaved = 1
  integer, parameter :: thisIsParametered = 2
end module testMOD

我编译这个用: ifort -c testModule.f90 。 当我检查里面有什么吧:

>$ nm testModule.o
0000000000000000 T testmod._
0000000000000000 D testmod_mp_thisissaved_

只有thisIsSaved变量是存在的。 我知道我可以只改变thisIsParameteredsave ,而不是parameter ,但是,理想情况下,我想,以防止连接用户更改此值。 有没有办法做到这一点?

编辑:我想这个库是到C代码的访问,以及,不只是Fortran语言。

Answer 1:

这实际上应该被保存在mod文件。 所有的数据类型和函数原型都存储有这就是为什么你需要包括它,当你向某人发送一个文件.LIB。 尝试别的东西使用后链接模块中,它应该只是罚款。

本质上,mod文件有异曲同工之妙在C .h文件,所以当然你要与你的库包含它。

[更新:如果您正试图在C使用,那么像你说的,有没有办法让你轻松保持命名常量。 作为替代方案,您可以使用该实体的保护属性。 至少与Fortran语言,模块以外的任何东西从写入变量的限制。 我不知道如果C编译器和链接会尊重这种行为,但我认为这可能是你最好的拍摄。

module testMOD
 INTEGER, PROTECTED, BIND(C)  :: globalvar = 1
end module testMOD

不幸的是我真的没有做与使用C的互操作性,所以我真的不能保证是c会尊重保护属性,不允许变量改变。



Answer 2:

正如其他人指出,一个参数是一个命名常数和实现方式可以没有预留存储在对象代码,常数(特别是用于标量)。

你的图书馆应该为你的C客户端提供的头文件。 您可以通过的#define或const定义在头文件中的Fortran参数的值。

这需要在两个地方的参数值的维护,但你已经有一个维护负担与库的接口的其他方面。



文章来源: Fortran 'parameter' type not included in compiled object