2

Cでfortranモジュールサブルーチンを使用しようとしていますが、うまくいきません。これは私の問題の簡略化されたバージョンです:

サブルーチンを含む 1 つの fortran モジュールがあり、2 番目のサブルーチンがそのモジュールを使用しています。

!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

sb今、私はcで関数を呼び出したい:

//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 tosb'

問題を解決する方法を知っている人はいますか?

4

2 に答える 2

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 コンパイラとのリンクが容易になります。

于 2013-10-13T04:09:33.840 に答える