module - 如果仅使用模块,是否需要 fortran 库?

标签 module fortran shared-libraries

我正在尝试清理 fortran make 进程以进行分发。目前,创建了两个库,然后编译链接到库并包含模块文件的可执行文件。我从以前的答案( Distribute compiled fortran library with module files )中看到,您无法摆脱模块文件,并且它们对于每台机器和编译器都可能不同。这很烦人。

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

这总是有效吗(当我拥有的只是库中的模块时)?这是最佳实践吗?我是否应该考虑重写我的库而不使用模块,这样我就可以避免所有这些编译器依赖项并只分发 lib*.a 文件?这就是this document是指通过使用子模块(没有人支持 static lib with many modules )

最佳答案

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

您的所有公共(public)过程是否足够简单,以便它们不需要显式接口(interface)并且位于模块之外?那么您就不需要任何 .mod 文件。

您是否有一个简单的公共(public)模块或包含公共(public) API 的包含文件,其余部分是私有(private)的?然后,您可以分发 API 模块的源代码或包含文件。我建议在此模块中仅放置接口(interface) block 和其他声明。

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

子模块可以改变这一切,但实际上我并不指望它们能够解决编译器之间的可移植性。您的库的用户仍然需要您拥有的相同编译器。确实,封闭源代码软件的接口(interface)会更容易,但编译器之间的可移植性并不好。

关于module - 如果仅使用模块,是否需要 fortran 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25056052/

相关文章:

linux - 如何在内核模块中将网络接口(interface)设置为混杂模式?

python - ChatCompletion 功能从 openai 模块中消失

fortran - 如何使用 fortran 的扩展函数按 block 而不是按列复制数组?

具有多个类的 C++ 共享库

c++ - 扩展名为 ".a"的共享库?

events - Magento : Obtain Id for order, 监听事件 checkout_onepage_controller_success_action

python模块导入 - 相对路径问题

Fortran 二维数组初始化

optimization - 是否可以让 isnan() 在 gfortran -O3 -ffast-math 中工作?

c++ - linux系统找不到libexpat