Fortran 'parameter' 类型未包含在编译对象中

标签 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

我编译这个:ifort -c testModule.f90 .当我检查里面的东西时:
>$ nm testModule.o
0000000000000000 T testmod._
0000000000000000 D testmod_mp_thisissaved_

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

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

最佳答案

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

本质上,.mod 文件与 c 中的 .h 文件具有相同的用途,因此您当然必须将它包含在您的库中。

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

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

不幸的是,我对与 C 的互操作性并没有真正做太多,所以我不能真正保证 C 会尊重 protected 属性并且不允许更改变量。

关于Fortran 'parameter' 类型未包含在编译对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14694796/

相关文章:

pointers - 比较两个指针

C++ 静态库 - 如何从 .lib 创建 .a 文件?

linux - 将/usr/local添加到./configure的路径中

c++ - 编译 Rust 静态库并在 C++ 中使用它 : undefined reference

fortran - 错误#6451 : A dummy argument name is required in this context

fortran - 第一列中的 "d"标签,Fortran 77

gcc - 以非编译器特定的方式更改 Fortran 中的目录

c++ - c_f_pointer 不起作用

java - 使用Java解析FORTRAN输出文件

compiler-errors - 通用 'dde_solver' 没有特定功能