c - Fortran 编译和 C 编译的 DLL 是否应该能够互换导入? (x86 目标)

标签 c dll x86 fortran

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

理想情况下,我只想用一种语言编写和维护这个库代码,而不是复制它(特别是因为我现在才对各种 C 语言有一定的了解,但还没有接触过 Fortran ).

我已经通过电子邮件发送给我们的两家供应商,看看他们的求解器在导入此 DLL 时是否需要任何特定的东西,但这让我在更基本的层面上感到好奇。如果我在 C 和 Fortran 中使用公开的方法 void foo(int bar) 编译一个 DLL...当它下降到 x86 机器指令时 - 它对该方法的方式有什么影响被程序“X”调用?到目前为止,我已经收集到,如果我要使用 C++,我需要 extern "C" 位来避免“损坏”——还有其他我应该注意的事情的?

最佳答案

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

而且函数的名称很重要,导出的函数名称通常装饰有额外的字符。这就是 extern "C" 的全部意义所在,它抑制了 C++ 编译器用来防止重载函数具有相同导出名称的名称修饰。因此,该名称是 C 编译器的链接器可以识别的名称。

如果您与用其他语言编写的代码互操作,C 编译器进行函数调用的方式几乎是标准的。任何现代 Fortran 编译器都支持声明以使其与 C 程序兼容。可以肯定的是,与您合作的任何软件供应商都已经使用过它,它们提供了用 Fortran 编写的附加组件。反之,只要您提供 C 编译器可以使用的函数,Fortran 程序员就很有可能调用它。

关于c - Fortran 编译和 C 编译的 DLL 是否应该能够互换导入? (x86 目标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21062263/

相关文章:

c++ - "rdtsc": "=a" (a0), "=d"(d0) 这是做什么的?

c - 如何检查void指针是否指向任意低地址?

C++ - 链接到第 3 方 DLL - 间歇性访问冲突

java - 如何制作包含DLL的Jar?

assembly - 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符, "vfmadd132pd"、 "231"和 "213"?

在实模式下用 Bresenham 的线算法计数,汇编

c - 从以太网 header 打印 MAC 地址

c - c 中的链表(我在这里做错了什么?)

c - 以下程序 : 的输出是什么

c++ - 哪个 DLL 有 PathCchAppend?