c - 如何在加载 Fortran 模块时自动运行用户代码
问题描述
在使用 GCC 的 C 中,可以使用以下函数在加载共享库时调用一些代码:
static void __attribute__((constructor)) _my_initializer(void)
{
...
}
在网上搜索后,我在 Fortran 中找不到使用 GCC 的等价物(即 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!
推荐阅读
- algorithm - 平衡括号中的树
- c# - 转换 Func 的最简单方法
, IOrderedQueryable > 到功能 , IOrderedQueryable > - vb6 - 如何将 fpspread 导出到 Excel vb6?
- java - 基于作者姓名的泽西岛消息过滤应返回多个值
- typescript - Typescript IS 用于异步
- ruby-on-rails - Minitest - 你如何测试一个方法没有被调用?
- caching - 方法未返回带有 @Cacheable 注释的值
- c# - 如何在 WPF 中安全地显示随机生成的密码
- python - 第二次加载 Keras 模型时出错。Feed_dict 错误
- ebpf - stdio.h 标头不适用于 eBPF 内核程序