我正在尝试编译和链接调用c子例程的Fortran代码:
Fortran代码:
program adder
integer a,b
a=1
b=2
call addnums(a,b)
stop
end program
C代码:
void addnums( int* a, int* b )
{
int c = (*a) + (*b); /* convert pointers to values, then add them */
printf("sum of %i and %i is %i\n", (*a), (*b), c );
}
我在Windows环境中使用以下命令进行编译和链接。
ifort -c adder.f
cl -c addnums.c
ifort -o add adder.obj addnums.obj
我收到以下错误:
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
-out:add.exe
-subsystem:console
adder.obj
addnums.obj
adder.obj : error LNK2019: unresolved external symbol ADDNUMS referenced in function MAIN__
add.exe : fatal error LNK1120: 1 unresolved externals
请帮我解决这个问题?感谢。
答案 0 :(得分:11)
您需要在Fortran主程序的规范部分内为C函数提供一个接口体,告诉Fortran编译器名称addnums
是一个C函数。类似的东西:
INTERFACE
SUBROUTINE addnums(a, b) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT
IMPLICIT NONE
INTEGER(C_INT) :: a, b
END SUBROUTINE addnums
END INTERFACE
(对于没有特殊选项的那个平台上的那些编译器,默认类型的整数与C_INT相同 - 但是如果编译器/平台或编译选项发生变化,则明确表示整数KIND有助于保护你。)
答案 1 :(得分:2)
这是我可以立即看到的两件事(我主要使用FORTRAN77,所以这可能不是最新或最好的方法):
由于你的C函数是一个函数(而不是子程序),你需要将'addnums'声明为EXTERNAL。将其添加到声明部分的代码中。
EXTERNAL addnums
在C代码中为函数名添加下划线。 FORTRAN自动执行此功能,但不执行其他语言的功能。因此,函数的签名将是
void addnums_( int* a, int* b )
This page在混合C和FORTRAN方面有很好的理解。希望这有帮助!