Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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

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
Linux 如何在FORTRAN中检查动态库的可用性和加载动态库_Linux_Fortran_Shared Libraries - Fatal编程技术网

Linux 如何在FORTRAN中检查动态库的可用性和加载动态库

Linux 如何在FORTRAN中检查动态库的可用性和加载动态库,linux,fortran,shared-libraries,Linux,Fortran,Shared Libraries,我已经编写了一个FORTRAN库“B”,根据调用方式的不同,它可以调用也可以不调用另一个库“C”中的例程。目的是在应用程序“A”中使用“B” 到目前为止,B和C被编译为静态库(.a文件)。 这意味着C.a在编译B.a时必须可用并链接到,这是可以的。 这也意味着,在编译应用程序a时,C.a必须可用,即使a无意使用依赖于C的B中的功能。这很烦人,似乎没有必要,因为必须将C.a分发给从不使用它的用户 理想情况下,我希望将C作为动态/共享库,并在B中执行如下运行时可用性检查(伪代码): 在Linux上使

我已经编写了一个FORTRAN库“B”,根据调用方式的不同,它可以调用也可以不调用另一个库“C”中的例程。目的是在应用程序“A”中使用“B”

到目前为止,B和C被编译为静态库(.a文件)。 这意味着C.a在编译B.a时必须可用并链接到,这是可以的。 这也意味着,在编译应用程序a时,C.a必须可用,即使a无意使用依赖于C的B中的功能。这很烦人,似乎没有必要,因为必须将C.a分发给从不使用它的用户

理想情况下,我希望将C作为动态/共享库,并在B中执行如下运行时可用性检查(伪代码):


在Linux上使用FORTRAN是否可以执行类似操作?

使用
INQUIRE
应该可以检查文件,但加载它是不可能的。因此,我会尝试为库和加载的函数编写一个C包装器。也许有什么特别的Fortran2003可以做到这一点吗?您可以使用
ISO_C_BINDING
模块与C进行互操作,但我想,这不是您所要求的。我不知道有任何Fortran(2008)函数可以提供此功能。好的。有时,搜索引擎会完成它们的工作:在中,相应的函数
dlopen
dlsym
直接从Fortran调用。使用
ISO_C_BINDING
模块,您可以转换他的示例以满足您的需要。
if (requested feature from C)
    if (is_available(libC.so))
        call routine_from_C()
        (Go on...)
    else
        call Error("You need to install C")
else
    (We don't need C. Go on...)