FORTRAN代码调用c代码时发生错误
error occured when fortran code called c code
我使用了一本关于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"。您可以检查您的特定编译器来查看如何完成-但这几乎肯定是您遇到的问题。
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- VI工作室代码错误无法打开输出文件主.exe
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- 有关矩阵的代码错误导致分段错误(内核转储)
- C++ Schannel POST 400 错误代码错误请求
- Java 本机访问代码错误:"Invalid memory access"
- 代码错误修改
- C++代码错误分配
- "_FCbuild"不能用作函数 - C/C++ 代码错误
- 我的代码错误类型警告 1 警告 C4018 和更多错误
- 代码错误(从 1 到 100 找到质数)
- OpenCV VisualStudio,C 代码错误尝试访问像素
- 当我使用的教程完全没有错误时,为什么我的代码错误
- 简单的NOOB C 输入/输出问题:代码错误
- 为什么enumProcessModules返回false值和299代码错误
- WinhttpSetoption()失败设置TLSV1.2,带有错误代码错误_internet_incorrect_ha
- 苹果安全传输代码错误
- C++ - 国际象棋主教移动代码错误
- 导入Python库时,嵌入了Python代码错误
- 编译提升C 代码错误