从 Fortran 调用 C dll
Call C dll from Fortran
我已经创建了 c dll,我想在 visual studio 2019 年从 FORTRAN f90 调用那个 c dll。谁能帮忙举个例子。
我尝试了以下 code.The 代码构建成功,但是 运行,我遇到了如图所示的错误。
我的 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 select 编辑了错误的项目类型,或者您错误地将 DLL 命名为 "Command"项目的调试 属性 页面。
如果您正在使用 Intel Visual Fortran,这似乎很有可能,在 MixedLanguage 下的 Intel Parallel Studio XE for Windows Samples Bundle 中至少有两个从 Fortran 调用 C DLL 的有效示例。
包括 C 文件对 Fortran 不起作用,包括任何在 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 项目和 select 依赖项。)这将使构建顺序正确,但是因为 Visual C++ 没有不要为带有 non-C 个项目的 DLL 项目做输出依赖,你需要添加 C 项目的 .LIB 作为 Fortran 项目的源文件。
我已经创建了 c dll,我想在 visual studio 2019 年从 FORTRAN f90 调用那个 c dll。谁能帮忙举个例子。
我尝试了以下 code.The 代码构建成功,但是 运行,我遇到了如图所示的错误。
我的 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 select 编辑了错误的项目类型,或者您错误地将 DLL 命名为 "Command"项目的调试 属性 页面。
如果您正在使用 Intel Visual Fortran,这似乎很有可能,在 MixedLanguage 下的 Intel Parallel Studio XE for Windows Samples Bundle 中至少有两个从 Fortran 调用 C DLL 的有效示例。
包括 C 文件对 Fortran 不起作用,包括任何在 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 项目和 select 依赖项。)这将使构建顺序正确,但是因为 Visual C++ 没有不要为带有 non-C 个项目的 DLL 项目做输出依赖,你需要添加 C 项目的 .LIB 作为 Fortran 项目的源文件。