本文介绍了如何在c ++代码中调用模块中包含的Fortran90函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我在我的C ++项目中包括一个不是我的fortran90程序。I m including a fortran90 program that is not mine in my C++ project .在第一个步骤中,我尝试通过它们的name_()调用函数,并通过显示obj文件的符号来获得错误未定义的引用mp_mpi_cartesian_init_使用nm)我发现,函数被调用他们的模块作为module_function_所以我添加模块名称和我获得相同的问题,但在fortran obj之间,如Constants.f90 :(。文本+ 0x36):未定义引用__powi4i4In the first stept I try to call the function by their name_() and i get the error "undefined reference to mp_mpi_cartesian_init_ "by dispalying the symbol of the obj file (using nm) i found that the function are called by their module as module_function_ so i add the module name and i Get the same problem but between fortran obj such as "Constants.f90:(.text+0x36): undefined reference to __powi4i4"这里是c ++代码: #include <iostream> #include <complex> using namespace std; extern"C" { void mod_save_wave_mp_read_it_psi_(int * it,complex<double>* psi_E1E2 ); void mod_mpi_cartesian_mp_mpi_cartesian_init_( ); extern int mod_mpl_h_mp_iproc_ ; } int main(){ complex<double> psi_local[512*24*512*24]; int it ; mod_mpi_cartesian_mp_mpi_cartesian_init_(); cout << "proc :" << mod_mpl_h_mp_iproc_ << "avant lecture\n"; mod_save_wave_mp_read_it_psi_(&it,psi_local); cout << "psi ="<< psi_local[0] << "poiur le proc "<<mod_mpl_h_mp_iproc_ <<"\n"; }这是模块的示例:MODULE mod_save_waveUSE mod_constantsUSE 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 !================================================================CONTAINSSUBROUTINE begin_count_time() IMPLICIT NONE prog_start_time = tempsEcoule() !END SUBROUTINE begin_count_timeSUBROUTINE 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_PSISUBROUTINE 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) ! !================================================================================ enddoEND SUBROUTINE WRITE_IT_PSIEND MODULE mod_save_wave推荐答案 我假设你使用的是g ++,gfortran,mpif90工具链。如果您有一个模块I am assuming you are using the g++, gfortran, mpif90 toolchain. If you have a modulemodule rockercontainssubroutine bye_baby...end subroutine C ++中的外部C语言声明是The external C declaration for it in C++ isextern "C"{ // ,-- 2 Leading underscores to start // | ,-- then the module name // | | ,-- then _MOD_ // | | | ,-- then the subroutine name // V V V V extern void __rocker_MOD_bye_baby();}您可能还需要添加属性You may also need to add attribute((stdcall)) after the extern. By default, C assumes cdecl which stacks the parameters differently. 这篇关于如何在c ++代码中调用模块中包含的Fortran90函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
07-30 01:38
查看更多