С помощью 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
. Наконец, у меня есть основной файл
main.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_
и хоть убей, не могу понять, почему это больше не работает. Когда я использую версию f2py для python3.11, она компилируется без проблем.
Любая помощь очень ценится!
Тебе нужно:
-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
Я вижу два варианта (так как сборка мезонов может иметь неожиданные ограничения). Сначала явно указав файл библиотеки: /opt/lib/libmylib.a
. Во-вторых, сделайте копию только статической библиотеки во временный каталог для сборки, например, /tmp/dir
, и используйте ключи: -L/tmp/dir -lmylib
Что, если есть динамическая и статическая версии этой библиотеки, и мне нужна статическая. По какой-то причине
-lmylib.a
не работает и всегда выбирает динамический *.so.