我在我的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):未定义引用__powi4i4
In 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_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推荐答案
我假设你使用的是g ++,gfortran,mpif90工具链。如果您有一个模块
I am assuming you are using the g++, gfortran, mpif90 toolchain. If you have a module
module rocker contains subroutine bye_baby ... end subroutineC ++中的外部C语言声明是
The external C declaration for it in C++ is
extern "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(); }您可能还需要添加属性< stdcall))之后。默认情况下,C假定为cdecl,它以不同的方式堆叠参数。
You may also need to add attribute((stdcall)) after the extern. By default, C assumes cdecl which stacks the parameters differently.
更多推荐
如何在c ++代码中调用模块中包含的Fortran90函数?
发布评论