使用 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时,编译没有问题。
非常感谢任何帮助!
您需要:
-L"$(pwd)"
而不是 -L.
,因为 meson
在临时目录中构建模块,而不是在当前目录中;-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