我在参考书中使用了一种关于调用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代码中。我的代码几乎与参考书中的代码相同。怎么了?
答案 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”。您可以检查您的特定编译器,看看它将如何完成 - 但这几乎肯定是您遇到的问题。