2

fortran サブルーチンを呼び出す ac コードをコンパイルしようとしていますが、常にエラーが発生します。

Fortran コードは次のとおりです。

!fort_sub.f90
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

if(a>10) then
   stop
endif
end subroutine add1
end module myadd

そしてここにcコードがあります

//main.cpp
extern "C"{ void add1(int * a); }

int main(void){
  int a=2;
  add1(&a);
  return 0;
}

それらをコンパイルすると

ifort -c fort_subs.f90
icc main.cpp fort_subs.o

エラーが発生します

Undefined symbols for architecture x86_64:   "_for_stop_core", referenced from:
      _add1 in fort_subs.o ld: symbol(s) not found for architecture x86_64

そして、それらをコンパイルすると

icc -c main.cpp 
ifort -nofor-main fort_subs.f90 main.o

エラーが発生します

Undefined symbols for architecture x86_64:
  "___gxx_personality_v0", referenced from:
      Dwarf Exception Unwind Info (__eh_frame) in main.o
  "___intel_new_feature_proc_init", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64

では、なぜこれらのエラーが発生し、どのように解決すればよいのでしょうか?

IBMコンパイラには、Cコンパイラにfortranライブラリをリンクするように指示するオプション「-lxlf90」があることを知っています。これにより、「_for_stop_core」エラーが解決されます。intel c コンパイラに同様のオプションはありますか?

4

1 に答える 1

0

STOPC は Fortran のコマンドが気に入らないようです。プログラムを停止したい場合は、次のように 2 番目の値を入れることを検討してください。

subroutine add1(a,kill) bind(c)
   integer (c_int), intent(inout) :: a, kill
   kill = 0
   a = a+1
   if(a > 10) kill=1
end subroutine

そしてmain.cpp

//main.cpp
#include <stdio.h>
extern "C"{ void add1(int * a, int * kill); }

 int main(void){
  int a=20, kill;
  add1(&a, &kill);
  if(kill!=0) {
    printf("program halted due to a>10\n");
    return 0;
  }
  return 0;
}
于 2013-10-14T16:38:07.943 に答える