使用f2py编译与PET连接的Fortran代码

2024-10-02 00:37:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题与这篇文章有关:

Including a compiled module in module that is wrapped with f2py (Minimum working example)?

海报试图用f2py编译一个Fortran代码(Test.f90),并将其链接到一个预编译的库(在我的例子中是object,myex44f.o)。这个答案使我能够编译Fortran代码并生成python模块。在

我的问题不同于上面的海报问题,因为我的对象链接到PETSc。当我试图将f2py生成的库导入python时,我得到一个错误:它找不到PETSc子例程“vecdostroy”。我最近的尝试是:

f2py-c--fcompiler=gfortran-I.myex44f.o../../../Codes/third_-party/petsc/include/petsc/finclude/petscdef.h-m测试测试.f90

下面是代码Test.f90:

subroutine test  
USE petsctest  
call mainsub  
end subroutine test

它从模块petsctest调用mainsub

^{pr2}$

我得到的错误是:

import test Traceback (most recent call last): File "", line 1, in ImportError: ./test.so: undefined symbol: vecdestroy_

有人有什么建议吗?非常感谢你能为我提供的任何帮助。在

更新: 我使用PETSc示例提供的makefile生成了原始的myex44f.o对象。查看链接行,我推断在使用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吗?f2py似乎不明白这些。谢谢你的评论。在

已解决 我找到了我的问题。我不能让f2py接受-Wl,rpath选项,但是如果我定义环境变量LD_LIBRARY_PATH=/home/costoich/Documents/AFPWork/Codes/third_party/petsc/arch-linux2-c-debug/lib,那么一切都会成功。谢谢你的帮助。在


Tags: testgnuhome链接linuxpartylibx86
1条回答
网友
1楼 · 发布于 2024-10-02 00:37:30

@VladimirF,有道理。在

It looks like if the VecDestrou is not in the PETSC module you are using.

在我看来,PETSc的以下部分在您的模块中是必需的。在

#include <petsc/finclude/petscsysdef.h>
#include <petsc/finclude/petscvecdef.h>
! Optional
#include <petsc/finclude/petscdef.h>
#include <petsc/finclude/petscdm.h>
#include <petsc/finclude/petscvec.h> 
#include <petsc/finclude/petscvec.h90>  
#include <petsc/finclude/petscmat.h>
#include <petsc/finclude/petscmat.h90>
! might be not completed
! Or
use petscksp
use petscdm
use petscvec
use petscmat 
!might be not completed

如何在Fortran中使用PETSc是讨论here,我个人认为在该页中选择2。大多数现有的PETSc示例也遵循选项2。在

请让我澄清一下,I am not encouraging you to use ^{} over ^{},这是我习惯的做法。PETSc文档有一个使用Fortran模块的例子,例如here。因此,您可以选择这些方法中的任何一种/或同时使用这两种方法(请注意,在该示例中,预处理器选项PETSC_USE_FORTRAN_MODULES),但仍需要添加所需的模块,这取决于您使用的是什么。在

相关问题 更多 >

    热门问题