通过在 C++ 接口周围创建 C 包装器,在 FORTRAN 中调用 C++ dll 文件 [关闭]

Posted

技术标签:

【中文标题】通过在 C++ 接口周围创建 C 包装器,在 FORTRAN 中调用 C++ dll 文件 [关闭]【英文标题】:Calling a C++ dll file in FORTRAN, by creating C wrapper around C++ interface [closed] 【发布时间】:2016-03-22 14:01:01 【问题描述】:

我的任务是在 FORTRAN 中开发一段代码,该代码将调用用 C++ 编写的 .dll 文件并使用 dll 文件中的子例程进行计算。 我已经向 .dll 文件的开发人员发送了有关这种实现可能性的邮件。下面是给开发者的回复

这个接口不可能直接从 FORTRAN 调用。 可以围绕 C++ 类接口创建标准 C 包装器,然后从 FORTRAN 调用标准 C(使用可以链接和调用 Visual Studio .dll 的编译器)。"

我自己是使用 dll 的业余爱好者,任何帮助(教程链接、示例代码)将不胜感激。

到目前为止的状态:由于我没有dll文件的源代码,所以我执行了dumpbin并提取了函数的名称。

【问题讨论】:

这里有一个完整的标签 fortran-iso-c-binding 用于连接 Fortran 和 C。C++ 只是在其中添加了 extern "C"。该标签中也有许多关于 C++ 的问题和答案。从您的问题中不清楚 Fortran 是否调用 C++ 或相反或两者兼而有之。 @VladimirF 它说“在 FORTRAN 中开发一段代码,它将调用用 C++ 编写的 .dll 文件并使用 dll 文件中的子例程进行计算。” ,所以我很清楚他想从他的 fortran 代码中调用一个 C++ 函数。我的问题是,你能用 C 语言创建你的主项目,然后将 C++ dll 和他的 Fortran 子程序作为库调用吗? @Slex 好的,当我读到它时我迷路了。关于你的另一点,你为什么要引入这样的复杂性? 【参考方案1】:

您创建了一系列 C++ 函数,每个函数都声明为 extern "C",以便从 Fortran 中调用。要构建它们,您需要 DLL 的头文件;包含它,然后编写必须编写的任何 C++ 代码,以从一个简单的、fortran 可调用的函数映射到 DLL 所宣传的 API。

【讨论】:

更新。我使用 dumpbin 命令创建了一个 .lib 文件,并在 C++ 中创建了一个静态库项目,创建了一个名为“extern.hpp”的文件,在函数名称之前声明了 extern "C"。尝试编译它们,确实它们被编译了。但是没有生成 .lib 文件。我做错了什么,还是应该完全采用全新的方法?

以上是关于通过在 C++ 接口周围创建 C 包装器,在 FORTRAN 中调用 C++ dll 文件 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我是不是必须在 Opencv C 包装器中为 C++ 接口释放 New 分配的内存

如何为在 C 中使用 C++ 代码创建包装器?

从 C 包装器创建 C++ 对象

SWIG包装器未声明(此功能首次使用)

我可以用 C 包装 OpenCV 的 C++ 接口,然后用 Lisp 的 CFFI 包装它吗?

OpenCv c++ 为基本打印垫功能创建一个 C 包装器?