当fortran代码调用c代码时发生错误

时间:2013-06-09 02:55:17

标签: c++ c fortran

我在参考书中使用了一种关于调用c代码的fortran代码的方法。方法是,如果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("%s\n","kk");
    scanf("%d",&a);
 }
 #ifdef _cplusplus
 }
 #endif

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

从包含_stdcall我推断出你可能正在使用Windows平台。不幸的是我在Mac上工作,所以事情可能不完全一样。但是,以下内容适用于我(代码中的小改动),以便混合使用Fortran和C代码。注意 - 在我的Mac上,gcc编译器不包含Fortran,所以我使用了一个单独的Fortran编译器gfortran,它是从link http://hpc.sourceforge.net下载的{{3}} - 其中的说明安装也可以找到。

程序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”。您可以检查您的特定编译器,看看它将如何完成 - 但这几乎肯定是您遇到的问题。