【问题标题】:Call C dll from Fortran从 Fortran 调用 C dll
【发布时间】:2019-11-30 00:42:17
【问题描述】:

我已经创建了 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;

【问题讨论】:

  • 请阅读How to Askminimal reproducible example。您必须显示有关 DLL 的详细信息,至少要显示要调用的 C 函数的签名以及您当前的工作以及遇到的问题和错误。网上有很多 Fortran-C 教程和这个站点上的很多问题,请参阅fortran-iso-c-binding 标记以了解其中的许多问题。你的问题目前太宽泛了。你甚至没有问任何实际问题。
  • 感谢您的回答,我已经编辑了我的问题
  • 当你上传图片时,网站告诉你不要将它用于代码和错误消息。请务必将错误消息以文本形式复制到您的问题中,以便遇到类似问题的其他人可以找到您的问题。
  • 复制错误消息后,您还必须显示用于构建代码的 exact 命令或配置以及 exact 编译器用于 C 和 Fortran 的版本。你能构建和运行纯 C 程序吗?你能构建和运行纯 Fortran 程序吗?

标签: c dll fortran call


【解决方案1】:

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

如果您使用的是 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 项目并选择依赖项。)这将获得正确的构建顺序,但是因为 Visual C++ 不为 DLL 做输出依赖项具有非 C 项目的项目,您需要将 C 项目的 .LIB 添加为 Fortran 项目的源文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多