使用C++代码从FORTRAN DLL调用函数

4
我可以帮你进行翻译。以下是需要翻译的内容:

我想在C++代码中加载一个Fortran dll,并调用Fortran dll中的函数。

以下是代码:

  SUBROUTINE SUB1()
  PRINT *, 'I am a function '
  END

创建foo.dll(fortran dll)后,以下是我用Visual Studio 2012编写的C++代码,用于加载Fortran DLL并调用Fortran代码中的SUB1函数。
#include <iostream>
#include <fstream>
#include <Windows.h>

using namespace std;  
extern "C" void SUB1();
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);

int main(void)
{
                LoadLibrary(L"foo.dll");

                PGNSI pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("foo.dll")),"SUB1");

                return 0;

}

在运行时,我遇到了以下错误:
程序无法启动,因为libgcc_s_dw2-1.dll在您的计算机中丢失。 尝试重新安装程序以解决此问题。
这是从C++调用dll的正确方法吗? 我对这个Fortran dll非常陌生。请帮助我解决这个问题。

1
请提供您的操作系统、Fortran和C++编译器。编译器标志也会很有用。尝试搜索 fortran-iso-c-binding 以开始使用Fortran-C互操作性。 - Peter Petrik
1个回答

3

首先,您需要像这样导出函数...

!fortcall.f90
subroutine Dll1() BIND(C,NAME="Dll1")
implicit none
!DEC$ ATTRIBUTES DLLEXPORT :: Dll1
PRINT *, 'I am a function'
return
end !subroutine Dll1

使用以下命令创建dll
gfortran.exe -c fortcall.f90
gfortran.exe -shared -static -o foo.dll fortcall.o

接下来,请将libgcc_s_dw2-1.dlllibgfortran-3.dlllibquadmath-0.dll放置在VS应用程序路径中。或者您可以将其添加到环境变量中。

完成后,您可以像以下方式从VS中调用FORTRAN公开的函数...

#include <iostream>
#include <Windows.h>

using namespace std;
extern "C" void Dll1();
typedef void(* LPFNDLLFUNC1)();

int main(void)
{
    HINSTANCE hDLL;
    LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer

    hDLL = LoadLibrary(L"foo.dll");

    if (hDLL != NULL)
    {
        lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"Dll1");
        if (!lpfnDllFunc1)
        {
            // handle the error
            FreeLibrary(hDLL);
            return -1;
        }
        else
        {
            // call the function
            lpfnDllFunc1();
        }
    }
    return 0;
}

1
“!DEC$ ATTRIBUTES DLLEXPORT” 真的有用吗?我相信 gfortran 忽略了 “!DEC$” 指令。据我所知,GCC 默认导出所有符号。肯定不需要 return 语句。 - Vladimir F Героям слава
这是一个非常老的问题,但我正在调查并发现这个主题是一个顶级结果,但从我收集到的信息来看,!DEC$ ATTRIBUTES DLLEXPORT 是为 ifort 设计的,您需要使用编译器的 /dll 选项编译源代码才能使其工作。 - ghylander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接