加载Fortran模块后如何自动运行用户代码

时间:2018-07-25 06:46:59

标签: c gcc fortran gfortran

在使用GCC的C语言中,可以使用以下函数在加载共享库时调用一些代码:

static void __attribute__((constructor)) _my_initializer(void)
{
    ...
}

在网络上进行了一些搜索之后,我找不到使用GCC(即gfortran)的Fortran中的等效项。由于此功能来自GCC,因此请确保该功能在gfortran中必须存在(因此,该功能应在GCC支持的所有语言中可用)。有指针吗?

1 个答案:

答案 0 :(得分:5)

“请确保此功能必须来自gcc,因为它必须存在于gfortran中”。这显然是错误的。它根本不必存在。 gfortran确实支持!GCC$ ATTRIBUTES指令,但是支持的属性数量有限。

您可以使用C语言编写构造函数,并使它成为同一库的一部分,并调用所需的任何Fortran代码。

示例:

library.f90:

subroutine sub() bind(C)
 write(*,*) "Hello!"
end subroutine

init_library.c:

void sub(void);
static void __attribute__((constructor)) _init(void)
{
    sub();
}

load_library.c:

#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
typedef void (*foo)(void);
int main(int argc, char* argv[])
{

    void *lib = dlopen("library.so", RTLD_NOW);
    if(lib == NULL)
        return printf("ERROR: Cannot load library\n");
    dlclose(lib);
}

编译并运行:

> gfortran -c -fPIC init_library.c
> gfortran -c -fPIC library.f90
> gfortran -shared library.o init_library.o -o library.so
> gfortran load_library.c -ldl
> ./a.out 
 Hello!