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
Module 如果只使用模块,是否需要fortran库?_Module_Fortran_Shared Libraries - Fatal编程技术网

Module 如果只使用模块,是否需要fortran库?

Module 如果只使用模块,是否需要fortran库?,module,fortran,shared-libraries,Module,Fortran,Shared Libraries,我正在尝试清理一个fortran make分发过程。目前,制作了两个库,然后编译链接到库的可执行文件,包括模块文件。我从前面的回答中看到,您无法摆脱模块文件,而且对于每台机器和编译器,它们可能是不同的。这很烦人 但是,我的库中的代码完全由模块组成。看起来我根本不需要图书馆的部分;我可以只包括模块。我已经试过了,它确实编译并运行在小示例上 当我只有库中的模块时,这会一直有效吗?这是最佳实践吗?相反,我应该考虑改写我的库而不是使用模块,这样我就可以避免所有这些编译器依赖关系,只分发LIB文件。这就是

我正在尝试清理一个fortran make分发过程。目前,制作了两个库,然后编译链接到库的可执行文件,包括模块文件。我从前面的回答中看到,您无法摆脱模块文件,而且对于每台机器和编译器,它们可能是不同的。这很烦人

但是,我的库中的代码完全由模块组成。看起来我根本不需要图书馆的部分;我可以只包括模块。我已经试过了,它确实编译并运行在小示例上


当我只有库中的模块时,这会一直有效吗?这是最佳实践吗?相反,我应该考虑改写我的库而不是使用模块,这样我就可以避免所有这些编译器依赖关系,只分发LIB文件。这就是使用无人支持的子模块所指的吗?这实际上取决于库中的功能。它只有几个声明吗?那么.mod文件就足够了,但是为什么不在这样简单的情况下分发源代码呢

是否所有的公共过程都足够简单,因此它们不需要显式接口,并且在模块之外?那么你就不需要任何.mod文件了

您是否有一个简单的公共模块或带有公共API的包含文件,而其余的是私有的?然后可以分发API模块的源代码或包含文件。我建议只在这个模块中放置接口块和其他声明

注意一个重要的问题。使用接口锁或类似方法可以避免使用不可移植的.mod文件,但如果过程使用更高级的参数传递,则它们的ABI通常无法在不同的编译器甚至某些编译器版本之间移植。您将能够编译它,并在调用库时获得神秘的崩溃


子模块可以改变一切,但实际上我并不期望它们能解决编译器之间的可移植性问题。库的用户仍然需要与您相同的编译器。的确,连接封闭源代码软件会更容易,但编译器之间的可移植性不会更高。

这取决于库中的功能。它只有几个声明吗?那么.mod文件就足够了,但是为什么不在这样简单的情况下分发源代码呢

是否所有的公共过程都足够简单,因此它们不需要显式接口,并且在模块之外?那么你就不需要任何.mod文件了

您是否有一个简单的公共模块或带有公共API的包含文件,而其余的是私有的?然后可以分发API模块的源代码或包含文件。我建议只在这个模块中放置接口块和其他声明

注意一个重要的问题。使用接口锁或类似方法可以避免使用不可移植的.mod文件,但如果过程使用更高级的参数传递,则它们的ABI通常无法在不同的编译器甚至某些编译器版本之间移植。您将能够编译它,并在调用库时获得神秘的崩溃


子模块可以改变一切,但实际上我并不期望它们能解决编译器之间的可移植性问题。库的用户仍然需要与您相同的编译器。的确,连接封闭源代码软件会更容易,但编译器之间的可移植性不会更高。

您可以从库lib*.a链接,也可以从目标文件链接。两者至少都依赖于平台,因此比源代码更难分发。库文件可能具有文件较少的优点。在任何一种情况下,从lib*a或对象文件链接,都可以将代码作为要调用的过程库呈现给用户。如果您不想分发源代码,那么无论您支持多少平台,您都必须进行编译。模块是现代Fortran的一个主要优势,它可以自动检查过程的实际参数和伪参数。例如,与C头文件相比,它们具有自动的优点,但缺点是生成依赖于编译器的中间文件。如果您正在向其他程序员提供过程,那么不向他们提供这种接口检查似乎是个坏主意。如果要隐藏源代码,则可以编写描述过程的接口块,并仅分发此源代码以供编译。

可以从库lib*.a链接,也可以从对象文件链接。两者至少都依赖于平台,因此比源代码更难分发。库文件可能具有文件较少的优点。在任何一种情况下,从lib*a或对象文件链接,都可以将代码作为要调用的过程库呈现给用户。如果你不想
若要分发源代码,则无论支持多少平台,您都必须进行编译。模块是现代Fortran的一个主要优势,它可以自动检查过程的实际参数和伪参数。例如,与C头文件相比,它们具有自动的优点,但缺点是生成依赖于编译器的中间文件。如果您正在向其他程序员提供过程,那么不向他们提供这种接口检查似乎是个坏主意。如果要隐藏源代码,则可以编写描述过程的接口块,并仅分发此源代码以供编译。

此代码都在模块中-没有外部声明。可能有20个文件,其中包含30个或更多模块,定义了至少那么多派生类型和更多过程。用户的程序实际上是一个使用和调用这些模块的脚本文件。但是,如果您编写,我的库中的代码完全由模块组成。看起来我根本不需要图书馆的部分;我可以只包括模块。什么是包含模块?什么是图书馆部分?您需要一些带有编译代码的文件,一个对象文件.o.obj或一个库.so.a.dll。只有当模块中只有声明且没有可执行代码时,才可以使用.mod。如果您指的是只有模块,那么只有.f90源文件就足够了,那么当然,您不必构建单独的库,只需调用f90 library.f90 main.f90即可得到结果,但我相信这是很明显的。我对糟糕的CS词汇感到抱歉。因此,库存档将替换对象文件,而不是.mod编译的模块文件。这一点现在很清楚。在您最初的帖子中,您是否建议分发一个库归档文件和一个模块源文件,我在其中定义了所有接口?有这样的例子吗?库是封闭源代码还是开放源代码?这些代码都在模块中-没有外部声明。可能有20个文件,其中包含30个或更多模块,定义了至少那么多派生类型和更多过程。用户的程序实际上是一个使用和调用这些模块的脚本文件。但是,如果您编写,我的库中的代码完全由模块组成。看起来我根本不需要图书馆的部分;我可以只包括模块。什么是包含模块?什么是图书馆部分?您需要一些带有编译代码的文件,一个对象文件.o.obj或一个库.so.a.dll。只有当模块中只有声明且没有可执行代码时,才可以使用.mod。如果您指的是只有模块,那么只有.f90源文件就足够了,那么当然,您不必构建单独的库,只需调用f90 library.f90 main.f90即可得到结果,但我相信这是很明显的。我对糟糕的CS词汇感到抱歉。因此,库存档将替换对象文件,而不是.mod编译的模块文件。这一点现在很清楚。在您最初的帖子中,您是否建议分发一个库归档文件和一个模块源文件,我在其中定义了所有接口?有这样的例子吗?库是封闭源代码还是开放源代码?