Связывание Python 3.12 f2py с библиотеками не работает должным образом

С помощью 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, она компилируется без проблем.

Любая помощь очень ценится!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Тебе нужно:

  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

Что, если есть динамическая и статическая версии этой библиотеки, и мне нужна статическая. По какой-то причине -lmylib.a не работает и всегда выбирает динамический *.so.

tkr 12.07.2024 11:28

Я вижу два варианта (так как сборка мезонов может иметь неожиданные ограничения). Сначала явно указав файл библиотеки: /opt/lib/libmylib.a. Во-вторых, сделайте копию только статической библиотеки во временный каталог для сборки, например, /tmp/dir, и используйте ключи: -L/tmp/dir -lmylib

Serge3leo 15.07.2024 10:12

Другие вопросы по теме