我正在尝试在c中使用fortran模块子程序而无法通过,这是我的问题的简化版本:
我有一个包含子程序的fortran模块,第二个子程序使用该模块。
!md.f90
module myadd
implicit none
contains
subroutine add1(a) bind(c)
implicit none
integer a
a=a+1
end subroutine add1
end module myadd
!sb.f90
subroutine sq(a) bind(c)
use myadd
implicit none
integer a
call add1(a)
a=a*a
end subroutine sq
现在我想在c:
中调用sb
函数
//main.cpp
extern "C"{ void sb(int * a); }
int main(){
int a=2;
sb(&a);
}
我应该如何将它们链接在一起?
我试过像
这样的东西ifort -c md.f90 sb.f90
icc sb.o main.cpp
但是它给出了错误
sb.o:在函数
sq': sb.f90:(.text+0x6): undefined reference to
add1'/ tmp /icc40D9n7.o:函数main': main.cpp:(.text+0x2e): undefined reference to
sb'
有谁知道如何解决这个问题?
答案 0 :(得分:3)
int main(void){
int a=2;
sb(&a);
return 0;
}
和
module myadd
use iso_c_binding
implicit none
contains
subroutine add1(a) bind(c)
implicit none
integer (c_int),intent (inout) :: a
a=a+1
end subroutine add1
end module myadd
!sb.f90
subroutine sq(a) bind(c, name="sb")
use iso_c_binding
use myadd
implicit none
integer (c_int), intent(inout) :: a
call add1(a)
a=a*a
end subroutine sq
与
gcc -c main.c
gfortran-debug fort_subs.f90 main.o
与Fortran编译器链接更容易,因为它引入了Fortran库。
答案 1 :(得分:1)
链接错误的原因有两个:
您从最终命令行(md.o)中省略了保存模块的源文件的目标文件。
您在C ++代码中的fortran sq
中调用了sb
。
修复这些问题,你就可以了。