0

我的目标是从 fortran 编译器调用 dll 文件。我正在使用mingw编译器在Windows中执行所有这些操作。

dll 是使用 g++ 编译器创建的

我试图为其创建 dll 的代码

// example_dll.cpp  
#include <stdio.h>
#include "example_dll.h"

__stdcall void hello()
{
        printf("Hello");
}

在命令提示符中输入的命令

g++ -c -DBUILDING_EXAMPLE_DLL example_dll.cpp

g++ -shared -o example_dll.dll example_dll.o -Wl,--out-implib,libexample_dll.a

上面两个命令创建了 dll 文件。

现在的工作是创建一个fortran脚本来编译之前创建的dll文件。

为此,我期待创建一个能够链接到先前创建的 dll 的 fortran 文件。

任何帮助将不胜感激。

谢谢, 阿达什

4

1 回答 1

0

后来我尝试了一些可能性。我更新的文件如下

为其创建DLL的C文件如下

// example_dll.c
#include <stdio.h>
#include "example_dll.h"

EXPORT void tstfunc (void)
{
  printf("Hello\n");
}

EXPORT int Double11(int x)
{
    printf("From the Double11\n");
    printf("%d\n",x);
    return x;
}

用于创建DLL的.h文件如下

// example_dll.h
#ifdef EXAMPLE_DLL_H
// the dll exports
#define EXPORT __declspec(dllexport)
#else
// the exe imports
#define EXPORT __declspec(dllimport)
#endif

// function to be imported/exported
EXPORT void tstfunc (void);

EXPORT int Double11(int x);

用于链接dll的Fortran文件如下

! fortcall.f90
program ForCall
    IMPLICIT NONE
    integer :: sum
    integer :: inte3 
    INTERFACE
        SUBROUTINE write() BIND(C,NAME='tstfunc')
        END SUBROUTINE write
        END INTERFACE
    INTERFACE       
        SUBROUTINE get_integer(inte,inte2) BIND(C,NAME='Double11')
        USE ISO_C_BINDING
        IMPLICIT NONE
        INTEGER (C_INT), VALUE :: inte
        INTEGER (C_INT), INTENT(OUT) :: inte2
        END SUBROUTINE get_integer
    END INTERFACE
    CALL write    
    CALL get_integer(1,inte3)
    print*,"the output is",inte3
END PROGRAM ForCall

在命令提示符下输入以下指令后

gfortran -o dll_foo_test fortcall.f90 -L。example_dll.dll

输出将如下所示

Hello
From the Double11
1
 the output is -2

在这一点上,有些事情是不对的。代码能够将值从 FORTRAN 传递到 DLL,而代码不会从 dll 返回正确的值。显示一些垃圾值 -2 而不是 1。

我想在代码中修复那部分。

于 2013-06-18T20:26:25.223 回答