Fortran编译的DLL和C编译的DLL是否可以互换导入?(x86目标)

Fortran编译的DLL和C编译的DLL是否可以互换导入?(x86目标),c,dll,x86,fortran,C,Dll,X86,Fortran,前提是:我正在编写一个符合行业标准接口/函数签名的插件DLL。这将在我的公司内部使用的至少两个不同的软件包中使用,这两个软件包都有这个特定接口的一些示例框架代码或空壳。一家供应商用C/C++编写了他们的示例,另一家用Fortran编写 理想情况下,我只想用一种语言编写和维护这个库代码,而不是复制它(特别是因为我刚刚在各种C语言中获得了一些舒适度,但还没有接触到Fortran) 我已经发电子邮件给我们的两个供应商,看看他们的解算器在导入这个DLL时是否需要任何特定的东西,但这让我在更基本的层面上感

前提是:我正在编写一个符合行业标准接口/函数签名的插件DLL。这将在我的公司内部使用的至少两个不同的软件包中使用,这两个软件包都有这个特定接口的一些示例框架代码或空壳。一家供应商用C/C++编写了他们的示例,另一家用Fortran编写

理想情况下,我只想用一种语言编写和维护这个库代码,而不是复制它(特别是因为我刚刚在各种C语言中获得了一些舒适度,但还没有接触到Fortran)


我已经发电子邮件给我们的两个供应商,看看他们的解算器在导入这个DLL时是否需要任何特定的东西,但这让我在更基本的层面上感到好奇。如果我用C和Fortran中的公开方法
voidfoo(intbar)
编译DLL。。。到了x86机器指令的时候——程序“X”调用该方法的方式有什么不同吗?到目前为止,我已经收集到如果我要做C++,我需要<代码>外部“C”/代码>位来避免“Frangle”——还有什么我应该知道的吗?< /P> < P>是的,这里已经讨论过很多次了。研究此标签中的答案和问题

fortran中的
extern“C”
的等价物是
bind(C)
。数据类型的等价性是通过使用内部模块
iso_c_binding
实现的

另外,请确保使用相同的调用约定。如果不手动指定任何内容,则两者的默认值通常相同。在Linux上,这是非问题。

外部“C”是在C++代码中使用的。所以如果DLL是用C++编写的,你不能通过任何C++对象(类)。


如果坚持使用C类型,则需要确保函数以单一方式传递参数,例如使用C的默认值
\u cdecl
。不确定Fortran使用什么。

这很重要。导出的函数必须使用特定的调用约定,在32位代码中有几种不兼容的调用约定。调用约定规定了函数参数的存储位置、传递顺序以及如何再次删除。以及函数返回值如何传回

函数名很重要,导出的函数名通常用额外的字符修饰。这就是 Extn(c)的全部内容,它抑制了C++编译器用来防止重载函数具有相同导出名的名称。因此,C编译器的链接器可以识别该名称


如果与其他语言编写的代码进行互操作,C编译器进行函数调用的方式几乎是标准的。任何现代Fortran编译器都将支持声明,使其与C程序兼容。当然,无论您与哪个软件供应商合作,提供用Fortran编写的附加组件,都已经使用了这种方法。另一方面,只要您提供可供C编译器使用的函数,Fortran程序员就有机会调用它。

非常有用的信息,谢谢。由于没有太多正式的CS背景,这些“胆量”级别的东西很容易被我忽略和忽略!作为补充,我现在看到了不同的调用约定可以在C++中通过使用y-ysddLead、y.cDell等(前者适合fortran使用)来指定。