FORTRAN代码调用c代码时发生错误

error occured when fortran code called c code

本文关键字:代码 错误 调用 FORTRAN      更新时间:2023-10-16

我使用了一本关于fortran代码调用c代码的参考书中的方法。方法是,如果c代码中的函数名是大写的,则可能不会在fortran代码中进行额外的更改。以下是我的代码:

Source1.f90:

program main
implicit none
call c_subprint()
endprogram

ccode.c:

#include <stdio.h>
#include <string.h>
#ifdef _cplusplus
extern "C" {
#endif
void _stdcall C_SUBPRINT()
 {
    int a;
    printf("%sn","kk");
    scanf("%d",&a);
 }
 #ifdef _cplusplus
 }
 #endif

错误信息是main函数找不到_C_SUBPRINT(LNK2019)。但是我已经将c代码生成的.lib添加到fortran代码中。我的代码和参考书里的几乎一样。怎么了?

不同的Fortran编译器生成不同的调用。许多人在例程名称中添加下划线,以避免与c代码的名称冲突。很难说你是否应该完全按照一本未命名的参考书的例子去做。在过去,要混合使用Fortran和C语言,您必须了解一些编译器的内部结构。在这里,Fortran编译器似乎在名称的开头添加了一个下划线。您可以通过将其添加到c++代码中来解决这个问题。但这是不可移植的,原则上可能会随着编译器的版本而改变。有一个更好的方法:Fortran的ISO_C_Binding。这是Fortran语言标准的一部分,因此是标准的和可移植的。示例在gfortran手册的"混合语言编程"章节和关于Stackoverflow的其他问题中给出。

从包含_stdcall我推断您可能正在使用Windows平台。不幸的是,我在Mac上工作,所以情况可能不完全一样。然而,下面的工作对我来说(从你的代码的小变化)得到一个混合的Fortran和C代码一起工作。注意-在我的Mac上,gcc编译器不包括Fortran,所以我使用了一个单独的Fortran编译器gfortran,我从http://hpc.sourceforge.net的链接下载-在那里也可以找到安装说明。

程序src1.f90:

program main
implicit none
call C_SUBPRINT()
endprogram

程序ccode.c:

#include <stdio.h>
#include <string.h>
void c_subprint_()
 {
    printf("hello world!n");
 }

注意,我去掉了#ifdef部分-我使用纯C,所以不需要;更重要的是,注意函数名

后面的下划线。

我按如下方式编译了这两个模块:

gcc -c ccode.c -o ccode.o
gfortran src1.f90 ccode.o -o hello

之后我可以运行

./hello

并得到预期的输出:

hello world!

如果没有下划线,链接器会报错未知符号。编译器中有一个选项可以关闭带有下划线的"name mangling"。您可以检查您的特定编译器来查看如何完成-但这几乎肯定是您遇到的问题。