0

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

来源1.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代码中。而且我的代码和参考书中的代码几乎一样。怎么了?

4

2 回答 2

2

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

于 2013-06-09T04:40:01.813 回答
1

从包含_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!

没有下划线,链接器会抱怨未知符号。编译器中有一个选项可以使用下划线关闭“名称修改”。您可以检查您的特定编译器以了解如何完成 - 但这几乎肯定是您遇到的问题。

于 2013-06-09T04:40:59.723 回答