Fortran'参数'类型不包含在编译对象中

时间:2013-02-04 20:13:50

标签: fortran static-libraries intel-fortran fortran-iso-c-binding

我有一个Fortran模块,其中包含一些具有属性parameter且一些具有属性save的变量。编译对象中不包含parameter个,这在尝试汇编库时会出现问题。例如,考虑一个文件testModule.f90

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

我用以下代码编译:{{1​​}}。当我查看其中的内容时:

ifort -c testModule.f90

只有>$ nm testModule.o 0000000000000000 T testmod._ 0000000000000000 D testmod_mp_thisissaved_ 变量存在。我知道我可以将thisIsSaved更改为thisIsParametered而不是save,但理想情况下,我希望阻止链接用户更改此值。有没有办法做到这一点?

编辑:我希望这个库可以被C代码访问,而不仅仅是Fortran。

2 个答案:

答案 0 :(得分:4)

实际应该存储在.mod文件中。所有数据类型和函数原型都存储在那里,这就是为什么在向某人发送.lib文件时需要包含它的原因。在使用其他内容之后尝试在模块中进行链接,它应该可以正常工作。

基本上.mod文件与c中的.h文件的用途相同,所以当然你必须将它包含在你的库中。

[更新:] 如果您尝试在C中使用它,那么正如您所说,您无法轻松维护命名常量。或者,您可以在实体上使用protected属性。至少在Fortran中,模块之外的任何东西都被限制写入变量。我不知道C编译器和链接器是否会尊重这种行为,但我认为这可能是你最好的镜头。

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

不幸的是,我对C的互操作性做的并不多,所以我不能保证C会尊重受保护的属性而不允许更改变量。

答案 1 :(得分:4)

正如其他人所说,参数是一个命名常量,实现可能不会在目标代码中为该常量留出存储空间(特别是对于标量)。

您的库应该为C客户端提供头文件。您可以通过#define或const。

在该头文件中定义Fortran参数的值

这需要在两个地方维护参数的值,但是你已经对库的界面的其他方面造成了维护负担。