从fortran调用dll

时间:2013-06-17 18:57:38

标签: dll g++ mingw fortran

我的目标是从fortran编译器调用一个dll文件。我正在使用 mingw 编译器在 windows 中完成所有这些工作。

使用g ++编译器

创建了dll

我正在尝试创建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文件。

任何帮助将不胜感激。

谢谢, 阿达什讷

1 个答案:

答案 0 :(得分: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。

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