我包括一个fortran90程序,它不在我的C++项目中。如何在C++代码中调用包含在模块中的Fortran90函数?
在第一个步骤中,我尝试通过name_()调用函数,并通过显示obj文件的符号(使用nm)得到错误“undefined reference to mp_mpi_cartesian_init_”,我发现该函数被调用他们作为module_function_所以我模块添加模块的名字,我也得到了同样的问题,但FORTRAN OBJ之间,如“Constants.f90 :(文字+ 0x36):未定义的引用__powi4i4”
这里是C++代码:
,这是一个模块的为例:
MODULE mod_save_wave
USE mod_constants
USE mod_MPI_CARTESIAN
USE mod_time_mesure, ONLY : tempsEcoule
USE mod_input_data, ONLY : Nt_laserPsansLaser
USE mod_input_data, ONLY : n_phi, n_rho1_seg, n_rho2_seg
USE mod_input_data, ONLY : Nt_periode, save_periodique
!////////////////////////////////////////////////////////////////
IMPLICIT NONE !
REAL(kind=d_t) :: prog_start_time, time_max_second !
character(len=80) :: IntermedWaveDir
!================================================================
CONTAINS
SUBROUTINE begin_count_time()
IMPLICIT NONE
prog_start_time = tempsEcoule() !
END SUBROUTINE begin_count_time
SUBROUTINE READ_IT_PSI(it, psi_E1E2)
IMPLICIT NONE
!////////////////////////////////////////////////////////////////////////////////
INTEGER :: it !
COMPLEX(kind=d_t), DIMENSION(n_phi,n_rho1_seg,n_phi,n_rho2_seg) :: psi_E1E2 !
!================================================================================
integer :: c
do c = 0, c_max-1
if(mod(iproc,c_max)==c) then
!////////////////////////////////////////////////////////////////////////////////
OPEN(unit=11,file=concat(trim(IntermedWaveDir),concat(concat('BACK/wave_',str_iproc),'_2p2p2')),&
status='old', form='unformatted', MODE='READ' )
READ(11) it !
READ(11) psi_E1E2 !
CLOSE(11) !
print*,'iproc,readed it=',iproc, it
endif
CALL MPI_BARRIER(MPI_COMM_WORLD,infompi) !
!================================================================================
enddo
!================================================================================
END SUBROUTINE READ_IT_PSI
SUBROUTINE WRITE_IT_PSI(it, psi_E1E2)
IMPLICIT NONE
!////////////////////////////////////////////////////////////////////////////////
INTEGER :: it !
COMPLEX(kind=d_t), DIMENSION(n_phi,n_rho1_seg,n_phi,n_rho2_seg) :: psi_E1E2 !
!================================================================================
integer :: c
do c = 0, c_max-1
if(mod(iproc,c_max)==c) then
!////////////////////////////////////////////////////////////////////////////////
OPEN(unit=11,file=concat(trim(IntermedWaveDir),concat(concat('wave_',str_iproc),'_2p2p2')),&
form='unformatted') !
WRITE(11) it+1 !---- recommence a partir de la prochaine iterat!
write(11) psi_E1E2 !
CLOSE(11) !
endif
CALL MPI_BARRIER(MPI_COMM_WORLD,infompi) !
!================================================================================
enddo
END SUBROUTINE WRITE_IT_PSI
END MODULE mod_save_wave
您可能需要链接一些Fortran库。 – 2013-03-21 20:40:19
其实我使用Fortran程序的make文件把所有obj的静态库重用它,当我编译我的C++程序,并在他的make文件不存在的extern LIB – user2196748 2013-03-21 21:29:08