从Fortran调用C dll

普拉文

我已经创建了C dll,我想在Visual Studio 2019中从FORTRAN f90调用该C dll。任何人都可以提供示例示例。

我已经尝试了下面的代码。该代码已成功构建,但是在运行时,出现如图所示的错误。

在此处输入图片说明

我的fortran代码

include 'MathLibrary.h'
program fortran
implicit none

print *, 'Max_size' , max_size

end program fortran

我的MathLibrary.h

#pragma once

#ifndef EXT_MYLIB
#ifdef DLL_BUILD
   #define EXT_MYLIB __declspec(dllexport)
 #else
#define EXT_MYLIB __declspec(dllimport)

#endif // DLL_BUILD

#endif // !EXT_MYLIB

 extern "C" int EXT_MYLIB max_size;

我的MathLibrary.cpp

#include "pch.h"
#include "MathLibrary.h"

int EXT_MYLIB max_size = 100;
史蒂夫·莱昂内尔

出现此错误消息的原因是,您在Visual Studio中为DLL选择了错误的项目类型,或者在项目的“调试”属性页上将DLL错误地命名为“命令”。

如果您使用的似乎是Intel Visual Fortran,则至少有两个可行的示例,其中在MixedLanguage下的Windows版英特尔Parallel Studio XE样本捆绑包中从Fortran调用了C DLL

对于Fortran而言,包括C文件不起作用,而在PROGRAM语句之前包括任何内容均无济于事。

您正在寻找从DLL引用C变量。这变得更加复杂。在Fortran中,C全局变量可与COMMON块或模块变量互操作。尽管现在不推荐使用以下语言,但将它作为COMMON块来做起来要容易一些:

program test
use, intrinsic :: ISO_C_BINDING
integer(C_INT) :: max_size
common /max_size/ max_size ! Same name, different entities
!DEC$ ATTRIBUTES DLLIMPORT :: /max_size/
print *, 'max_size', max_size
end

或者这是使用模块变量的方法。请注意,您将收到有关导入已定义符号的链接器警告-您可以忽略以下内容:

module my_mod
use ISO_C_BINDING
integer(C_INT) :: max_size
bind(C,name="max_size") :: max_size
!DEC$ ATTRIBUTES DLLIMPORT :: max_size
end module my_mod
program test
use my_mod
print *, 'max_size', max_size
end

您的C DLL项目需要与Fortran可执行项目分开。它们应该在同一Visual Studio解决方案中,并且Fortran项目应该依赖于C项目(右键单击Fortran项目并选择Dependencies。)这将获得正确的生成顺序,但是因为Visual C ++不会为DLL输出依赖关系项目与非C项目一起使用,则需要将C项目的.LIB添加为Fortran项目的源文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章