Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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
如何在C程序中使用Fortran共享库?_C_Fortran_Shared Libraries - Fatal编程技术网

如何在C程序中使用Fortran共享库?

如何在C程序中使用Fortran共享库?,c,fortran,shared-libraries,C,Fortran,Shared Libraries,我已经将几个子程序放入.f95文件中,用gfortran-shared-fPIC-obin/Debug/libpr10.so main.f95编译了它,现在我想在我的C程序中使用该库中的一些子程序。我该怎么做(语法上)?我是否必须在Fortran库中生成任何“头”,在那里我应该声明我想在库之外使用的子程序(如果它是C,我就必须这样做)? 如果我只是告诉链接器库在哪里,并尝试调用main()中的任何子例程,我会得到一个错误 更新我不想混合使用fortran和C!我只想使用Fortran共享库中的一

我已经将几个子程序放入.f95文件中,用
gfortran-shared-fPIC-obin/Debug/libpr10.so main.f95
编译了它,现在我想在我的C程序中使用该库中的一些子程序。我该怎么做(语法上)?我是否必须在Fortran库中生成任何“头”,在那里我应该声明我想在库之外使用的子程序(如果它是C,我就必须这样做)? 如果我只是告诉链接器库在哪里,并尝试调用
main()
中的任何子例程,我会得到一个错误

更新我不想混合使用fortran和C!我只想使用Fortran共享库中的一个子例程,甚至不带参数。尽管如此,我还是指出了一条通向.so库的路径,它对于C程序来说是“看不见的”!问题是如何告诉C程序实际上有一个我想要调用的子程序


如果我被“混合”的想法严重误解了,请纠正我。

好的,我不认为这个解决方案是通用的,但对于Microsoft Visual Studio,它应该在子例程名称之前是
\uu stdcall
,对于gcc,它应该在子例程名称之后是
\ucode>符号,例如,我们想调用名为menu的子例程,所以我们把
menu();进入主功能。

您会遇到什么错误?只需告诉链接器库在哪里。你不能有两个主程序。。。因为您将Fortran文件称为“main.f95”而感到奇怪。要混合使用Fortran和C,我建议首先使用选项“-C”编译C以获取目标文件,然后编译Fortran并使用gfortran链接所有文件,包括目标文件。一旦你开始工作,你可以尝试复杂化。如果你是从C调用Fortran子程序,你是在混合语言。您必须将库的情况通知链接器。为了引入Fortran运行时库,通常最容易与Fortran编译器链接。我建议先让它在没有共享库的情况下工作,只使用对象文件,然后添加该步骤。另外,看看带有Fortran ISO_C_绑定的标记,您可以指定过程名称并绕过名称混乱。