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
Fortran';参数';类型未包含在编译对象中_Fortran_Static Libraries_Intel Fortran_Fortran Iso C Binding - Fatal编程技术网

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

Fortran';参数';类型未包含在编译对象中,fortran,static-libraries,intel-fortran,fortran-iso-c-binding,Fortran,Static Libraries,Intel Fortran,Fortran Iso C Binding,我有一个Fortran模块,其中包含一些具有属性参数的变量,还有一些具有属性保存。参数不包括在已编译对象中,这在尝试组装库时成为一个问题。例如,考虑一个文件测试模块.F90: module testMOD integer, save :: thisIsSaved = 1 integer, parameter :: thisIsParametered = 2 end module testMOD 我使用:ifort-ctestmodule.f90编译此文件。当我检查里面的东西时: >

我有一个Fortran模块,其中包含一些具有属性
参数的变量
,还有一些具有属性
保存
参数
不包括在已编译对象中,这在尝试组装库时成为一个问题。例如,考虑一个文件<代码>测试模块.F90:

module testMOD
  integer, save :: thisIsSaved = 1
  integer, parameter :: thisIsParametered = 2
end module testMOD
我使用:
ifort-ctestmodule.f90
编译此文件。当我检查里面的东西时:

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


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

它实际上应该存储在.mod文件中。所有的数据类型和函数原型都存储在那里,这就是为什么在向某人发送.lib文件时需要包含它的原因。尝试链接模块后,使用它在其他东西,它应该工作得很好

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

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

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

不幸的是,我并没有在与C的互操作性方面做太多工作,所以我不能保证C会尊重受保护的属性,并且不允许更改变量。

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

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


这需要在两个位置维护参数的值,但您已经在库接口的其他方面承担了维护负担。

但是,如果库是从C代码访问的,则它不会使用.mod文件。这是真的。因此,您希望C编译器也使用该代码,并且仍然具有参数eter可用。我必须考虑这个问题。我会在提出它时添加一些东西。您是否使用2003年的语言功能使其与c兼容?我在相关时使用ISO_c_绑定。这实际上是一个更大的代码库的一小部分,需要链接到c和Fortran代码。
protected
属性alloc将其视为变量,而
参数
是一个常量,然而,虽然它是一个变量,但空间只能从该模块内更改。因此,如果在该模块中使用子例程进行更改,则可以在该模块中对其进行修改。如果模块中有函数或子例程,或者甚至可能有类型方法,则可以使用also只要在模块中声明并分配了类型,就可以更改变量。对于库的外部用户,区别在于它将出现在对象文件中,而参数不会出现。我已经有了标题,但它们只有类似于
extern“C”的内容int testmod\u mp\u thisissaved\uu
。我想我可以修改我的makefile,让它填充头文件中的值。使用BIND(C)在您的模块变量上,直接指定它们的C名称。不要使用Fortran处理器的损坏名称-这是一个可移植性和维护噩梦的配方。ifort的模块名称会随着编译选项和编译器版本的更改而损坏-更不用说可能发生的更改移动到一个完全不同的处理器。Will使用
bind(C)
影响Fortran代码如何与库交互?对于变量-除了重新编译(属性将更改链接器使用的名称)-否。对于过程-它们必须具有显式接口(注意模块过程自动具有显式接口)。对于这两种情况(过程和变量)BIND(C)属性对声明/定义的对象施加了额外的要求(约束),但通常,如果您希望某个对象具有互操作性,那么您已经满足了这些约束条件-例如,F2008处理器的配套C编译器将不会对Fortran指针、可分配项等有任何线索。