我的目标是从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文件。
任何帮助将不胜感激。
谢谢, 阿达什讷
答案 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。
我想在代码中修复该部分。