<i id='akEZq'><tr id='akEZq'><dt id='akEZq'><q id='akEZq'><span id='akEZq'><b id='akEZq'><form id='akEZq'><ins id='akEZq'></ins><ul id='akEZq'></ul><sub id='akEZq'></sub></form><legend id='akEZq'></legend><bdo id='akEZq'><pre id='akEZq'><center id='akEZq'></center></pre></bdo></b><th id='akEZq'></th></span></q></dt></tr></i><div id='akEZq'><tfoot id='akEZq'></tfoot><dl id='akEZq'><fieldset id='akEZq'></fieldset></dl></div>

  • <legend id='akEZq'><style id='akEZq'><dir id='akEZq'><q id='akEZq'></q></dir></style></legend>
      <bdo id='akEZq'></bdo><ul id='akEZq'></ul>

    <tfoot id='akEZq'></tfoot>

      <small id='akEZq'></small><noframes id='akEZq'>

      1. 如何在 C++ 代码中调用模块中包含的 Fortran90 函数?

        how to call a Fortran90 function included in a module in c++ code?(如何在 C++ 代码中调用模块中包含的 Fortran90 函数?)
        • <small id='x8Q7w'></small><noframes id='x8Q7w'>

            <tbody id='x8Q7w'></tbody>

          • <i id='x8Q7w'><tr id='x8Q7w'><dt id='x8Q7w'><q id='x8Q7w'><span id='x8Q7w'><b id='x8Q7w'><form id='x8Q7w'><ins id='x8Q7w'></ins><ul id='x8Q7w'></ul><sub id='x8Q7w'></sub></form><legend id='x8Q7w'></legend><bdo id='x8Q7w'><pre id='x8Q7w'><center id='x8Q7w'></center></pre></bdo></b><th id='x8Q7w'></th></span></q></dt></tr></i><div id='x8Q7w'><tfoot id='x8Q7w'></tfoot><dl id='x8Q7w'><fieldset id='x8Q7w'></fieldset></dl></div>

                  <bdo id='x8Q7w'></bdo><ul id='x8Q7w'></ul>

                  <tfoot id='x8Q7w'></tfoot><legend id='x8Q7w'><style id='x8Q7w'><dir id='x8Q7w'><q id='x8Q7w'></q></dir></style></legend>

                • 本文介绍了如何在 C++ 代码中调用模块中包含的 Fortran90 函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我在我的 C++ 项目中包含了一个不是我的 fortran90 程序.

                  I m including a fortran90 program that is not mine in my C++ project .

                  在第一步中,我尝试通过他们的 name_() 调用该函数,并且通过显示 obj 文件的符号(使用 nm)我发现该函数是由他们的模块作为 module_function_ 所以我添加了模块名称,但在 fortran obj 之间遇到了同样的问题,例如Constants.f90:(.text+0x36): undefined reference to __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++ 代码:

                  here is the c++ code :

                   #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
                  ";
                       mod_save_wave_mp_read_it_psi_(&it,psi_local);
                       cout << "psi ="<< psi_local[0] << "poiur le proc "<<mod_mpl_h_mp_iproc_ <<"
                  ";
                     }
                  

                  这是一个模块的例子:

                  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 subroutine
                  

                  它在 C++ 中的外部 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();
                  }
                  

                  您可能还需要在 extern 之后添加 attribute((stdcall)).默认情况下,C 假设 cdecl 以不同的方式堆叠参数.

                  You may also need to add attribute((stdcall)) after the extern. By default, C assumes cdecl which stacks the parameters differently.

                  如果您不想要 __rocker_MOD 部分,则不应在模块中声明子程序/函数.

                  If you do not want the __rocker_MOD part, then the subroutine/function should not be declared in a module.

                  这篇关于如何在 C++ 代码中调用模块中包含的 Fortran90 函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  What is inside .lib file of Static library, Statically linked dynamic library and dynamically linked dynamic library?(静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么?)
                  How do I load a C DLL from the SXS in Python?(如何从 Python 中的 SXS 加载 C DLL?)
                  Can Cython code be compiled to a dll so C++ application can call it?(Cython 代码可以编译成 dll 以便 C++ 应用程序可以调用它吗?)
                  Delay Loading DLLs(延迟加载 DLL)
                  Throwing C++ exceptions across DLL boundaries(跨 DLL 边界抛出 C++ 异常)
                  Loading a dll from a dll?(从 dll 加载 dll?)

                • <small id='Es9hC'></small><noframes id='Es9hC'>

                  <i id='Es9hC'><tr id='Es9hC'><dt id='Es9hC'><q id='Es9hC'><span id='Es9hC'><b id='Es9hC'><form id='Es9hC'><ins id='Es9hC'></ins><ul id='Es9hC'></ul><sub id='Es9hC'></sub></form><legend id='Es9hC'></legend><bdo id='Es9hC'><pre id='Es9hC'><center id='Es9hC'></center></pre></bdo></b><th id='Es9hC'></th></span></q></dt></tr></i><div id='Es9hC'><tfoot id='Es9hC'></tfoot><dl id='Es9hC'><fieldset id='Es9hC'></fieldset></dl></div>
                    <tfoot id='Es9hC'></tfoot>
                      <tbody id='Es9hC'></tbody>
                        <legend id='Es9hC'><style id='Es9hC'><dir id='Es9hC'><q id='Es9hC'></q></dir></style></legend>
                        • <bdo id='Es9hC'></bdo><ul id='Es9hC'></ul>