Можно ли использовать статическое связывание при обертывании кода fortran с помощью f2py?

Как я уже говорил в предыдущем вопросе, Я пытаюсь запустить скрипт python, который использует код Fortran, обернутый f2py, на удаленном сервере. Если я скомпилирую модуль f2py локально на своем компьютере, а затем запущу скрипт на сервере, я получу следующую ошибку:

ImportError: liblapack.so.3: невозможно открыть общий объектный файл: нет такого файла или каталога

Это логично, так как lapack и blas не установлены на удаленном сервере, и, к сожалению, у меня нет привилегий суперпользователя для их установки. Мне интересно, могу ли я исправить это, используя статическую ссылку. В вики GNU указано, что

Один из способов избежать этого (дополнительные идеи можно найти на странице исполняемых файлов) — использовать так называемое статическое связывание, доступное с опцией -static. Затем Gfortran помещает код библиотеки в созданную программу, что позволяет ей работать без библиотеки (например, на компьютере, где gfortran не установлен).

Это звучит как именно то, что мне нужно. Если необходимые файлы библиотеки включены в модуль f2py, то мне не понадобятся модули lapack и blas на удаленном сервере, и я могу просто запустить его как есть. Однако я не уверен, что это статическое связывание действительно работает с f2py. В настоящее время я бегаю,

python -m numpy.f2py -llapack -lblas -c --fcompiler=gnu95 --compiler=unix signature_file.pyf 
object_files.o

object_files.o означает все взаимозависимые файлы Fortran, скомпилированные в объектные файлы, т.е. я запускал

gfortran -c -llapack -lblas object_file.F90 

на всех соответствующих файлах. Теперь я хотел бы сделать это с помощью статической ссылки, но как? Я пытался добавить -static при компиляции объектных файлов, но это ничего не изменило. Я также пытался добавить -static к вызову f2py, но это просто дает неизвестную ошибку опции.


person Jasper    schedule 22.12.2020    source источник
comment
и, к сожалению, у меня нет привилегий суперпользователя для их установки: не проблема, установите библиотеки DLL в каталог, который вы добавите в переменную среды LD_LIBRARY_PATH. Что касается статической компоновки, это должно быть возможно, но учтите, что f2py в любом случае создает динамическую библиотеку. Тем не менее, я считаю, что вы можете связать статическую версию blas/lapack для сборки этой dll (может быть, заставив правильный файл liblapack.a вместо просто -llapack? - кстати, если статические библиотеки установлены на вашем локальном компьютере)   -  person Jean-Claude Arbaut    schedule 22.12.2020
comment
Разве вы не можете просто скопировать liblapack.so.3 и любые зависимости на удаленный сервер, установить LD_LIBRARY_PATH туда, куда вы его скопировали, и запустить? Используйте ldd на liblapack.so.3, чтобы узнать, что еще он собирает.   -  person cup    schedule 23.12.2020


Ответы (1)


Да, это возможно внутри сценария setup.py, если вы используете Extension из numpy.distutils.core с extra_link_args=["-static", "-static-libgfortran", "-static-libgcc"].

Это объясняется в этом ответе.

person Amos Egel    schedule 20.03.2021