我已经创建了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] 删除。
我来说两句