0

私の質問はこの投稿に関連しています:

f2py でラップされたモジュールにコンパイルされたモジュールを含めますか (最小限の作業例)?

投稿者が f2py を使用して Fortran コード (Test.f90) をコンパイルし、それを事前にコンパイルされたライブラリ (または私の場合はオブジェクト、myex44f.o) にリンクしようとしていました。その答えにより、Fortran コードをコンパイルし、python モジュールを生成することができました。

私の問題は、オブジェクトが PETSc にリンクされているという点で、上記のポスターの問題とは異なります。f2py で生成したライブラリを Python にインポートしようとすると、PETSc サブルーチンである「VecDestroy」が見つからないというエラーが表示されます。私の最近の試みは:

f2py -c --fcompiler=gfortran -I. myex44f.o ../../../Codes/third_party/petsc/include/petsc/finclude/petscdef.h -m テスト Test.f90

コード Test.f90 は次のとおりです。

subroutine test  
USE petsctest  
call mainsub  
end subroutine test

mainsubモジュールから呼び出しますpetsctest

      module petsctest   !   Solves the linear system  J x = f
#include <petsc/finclude/petscdef.h>
      contains
      subroutine mainsub
      use petscksp; use petscdm
      Vec x,f
      Mat J
      DM da
      KSP ksp
      PetscErrorCode ierr
      call PetscInitialize(PETSC_NULL_CHARACTER,ierr)

      call DMDACreate1d(MPI_COMM_WORLD,DM_BOUNDARY_NONE,8,1,1,        &
     &  PETSC_NULL_INTEGER,da,ierr)
      call DMCreateGlobalVector(da,x,ierr)
      call VecDuplicate(x,f,ierr)
      call DMSetMatType(da,MATAIJ,ierr)
      call DMCreateMatrix(da,J,ierr)

      call ComputeRHS(da,f,ierr)
      call ComputeMatrix(da,J,ierr)

      call KSPCreate(MPI_COMM_WORLD,ksp,ierr)
      call KSPSetOperators(ksp,J,J,ierr)
      call KSPSetFromOptions(ksp,ierr)
      call KSPSolve(ksp,f,x,ierr)

      call MatDestroy(J,ierr)
      call VecDestroy(x,ierr)
      call VecDestroy(f,ierr)
      call KSPDestroy(ksp,ierr)
      call DMDestroy(da,ierr)
      call PetscFinalize(ierr)
      end

私が得るエラーは次のとおりです。

インポート テスト トレースバック (最新の呼び出しが最後): ファイル ""、1 行目、ImportError: ./test.so: 未定義のシンボル: vecdestroy_

誰か提案はありますか?あなたが私に提供できる助けをありがとうございました。

更新:myex44f.o PETSc の例で提供されているメイクファイルを使用して 、元のオブジェクトを生成しました。リンク行を見て、f2py でコンパイルする場合は、petsc ライブラリをリンクする必要があるかもしれないと考えました。私の現在の試みは:

f2py -c --fcompiler=gfortran -m test Test.f90 -I. myex44f.o -I/home/costoich/Documents/AFPWork/Codes/third_party/petsc/include -I/home/costoich/Documents/AFPWork/Codes/third_party/petsc/arch-linux2-c-debug/include -L/home/costoich/Documents/AFPWork/Codes/third_party/petsc/arch-linux2-c-debug/lib -lpetsc

これは、コンパイル手順中に正しくリンクしているようです (-lpetscパスなしで書くと、コンパイラは失敗します)。ただし、入力するとldd test.so、次のようになります。

linux-vdso.so.1 => (0x00007ffe09886000) libpetsc.so.3.7 => not found libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007fc315be5000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc31581b000) libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007fc3155dc000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc3152d3000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc3150bc000) /lib64/ld-linux-x86-64.so.2 (0x000055a3fad27000)

リンク フラグ Wl,rpath を使用するには 2 つ必要ですか? f2py はこれらを理解していないようです。コメントありがとうございます。

解決済み 問題が見つかりました。f2py に-Wl,rpathオプションを受け入れさせることはできませんが、環境変数を定義するとLD_LIBRARY_PATH=/home/costoich/Documents/AFPWork/Codes/third_party/petsc/arch-linux2-c-debug/libすべてがうまくいきます。ご協力ありがとうございました。

4

1 に答える 1