c++ - fortran代码调用c代码时出错

标签 c++ c fortran

我用过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("%s\n","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 上的其他问题中给出了示例。

关于c++ - fortran代码调用c代码时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17005979/

相关文章:

compiler-errors - 如何使用ifort编译器编写makefile?

c++ - 如何连接两个现有范围:: View ?

c++ - 动态添加一行到 std::string 二维 vector 数组

c++ - 是否允许编译器像带有 -O2 的英特尔 C++ 编译器那样删除无限循环?

c++ - 有没有更好的方法来检查是否存在 boost 共享内存段?

c - 程序按顺序忽略了一些函数

c - 如何正确(有效地)释放 gtk 小部件中的内存

FORTRAN IV/66 程序在 DO 循环中停顿

c - 这个代码片段是如何工作的?

c++ - 为什么将我的程序与 iso_c_binding 链接会导致对 __gfortran_ 的 undefined reference ?