gpt4 book ai didi

c - 如何在加载 Fortran 模块时自动运行用户代码

转载 作者:行者123 更新时间:2023-12-02 09:11:27 26 4
gpt4 key购买 nike

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

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

在网上进行一些搜索后,我找不到使用 GCC 的 Fortran 中的等效项(即 gfortran)。可以肯定的是,这个功能一定存在于 gfortran 中,因为它来自 GCC(因此它应该在 GCC 支持的所有语言中都可用)。有什么指点吗?

最佳答案

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

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

示例:

库.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!

关于c - 如何在加载 Fortran 模块时自动运行用户代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51512450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com