私の質問はこの投稿に関連しています:
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
すべてがうまくいきます。ご協力ありがとうございました。