Python 3.12 f2py 链接库无法正常工作

问题描述 投票:0回答:1

使用 Python 3.11 和 distutils 后端,我能够轻松编译一个接口文件,并链接到包含各种其他预编译 f90 文件的存档。现在有了介子,这似乎不再可能了。

所以我有两个子程序:

子程序1.f90

subroutine subroutine1
    implicit none
    call subroutine2
    print *, "Inside subroutine1"
end subroutine subroutine1

子程序2.f90

subroutine subroutine2
    implicit none
    print *, "Inside subroutine2"
end subroutine subroutine2

我使用

gfortran -c subroutine1.f90 subroutine2.f90
编译这两个文件,并通过命令
ar rcs libmylibrary.a subroutine1.o subroutine2.o
将它们放入存档中。最后我有一个主文件

主.f90

subroutine main
    implicit none
    call subroutine1()
end subroutine main

当我使用

f2py -c main.f90 -m inter -L. -lmylibrary.a
时,我得到了接口文件。尝试将我的 python 文件中的接口导入为
import inter
我收到错误:
ImportError: /home/XYZ/f2pytest/inter.cpython-312-x86_64-linux-gnu.so: undefined symbol: subroutine1_
并且我一生都无法弄清楚为什么这不再起作用。当我使用python3.11版本的f2py时,编译没有问题。

非常感谢任何帮助!

python fortran gfortran meson-build f2py
1个回答
0
投票

您需要:

  1. 使用
    -L"$(pwd)"
    而不是
    -L.
    ,因为
    meson
    在临时目录中构建模块,而不是在当前目录中;
  2. 使用
    -lmylibrary
    代替
    -lmylibrary.a
    ,可能是你的错误。

对于 macOS:

$ python3.12 -m numpy.f2py -c main.f90 -m inter -L"$(pwd)" -lmylibrary
...
ninja: Entering directory `/private/var/folders/wy/z0gbkfgs7mv24ryqkdm90rm40009rh/T/tmpaj6e0z70/bbdir'
...
$ python3.12 -c "import inter; print(inter.__doc__); inter.main()"
This module 'inter' is auto-generated with f2py (version:1.26.4).
Functions:
    main()
.
 Inside subroutine2
 Inside subroutine1
© www.soinside.com 2019 - 2024. All rights reserved.