Как связать статическую библиотеку с numpy + gfortran - PullRequest
0 голосов
/ 03 октября 2018

Я использую numpy для создания модуля из кода fortran 90 для Windows с MSVC и gfortran.Идея состоит в том, чтобы создать колесо с python setup.py bdist_wheel.

. Я использую следующий код Python для создания модуля.Все компилируется, работает нормально, пока я не использую библиотеки gfortran, такие как openmp (-lgomp).Мне удается создавать объекты с -fopenmp, но я не могу связать.

Когда я связываюсь с gomp, я не знаю, где дать этот ввод.Флаг компиляции -fopenmp входит в extra_f90_compile_args, но.Я попытался несколько аргументов без успеха (extra_link_args, library_dirs, libraries, runtime_library_dirs, extra_objects, f2py_options).

Я нашел решение, отредактировав функцию, которая генерируеткоманда связи для gfortran.Если я отредактирую следующий файл numpy\distutils\fcompiler\gnu.py, я могу добавить -lgomp, он работает, но он грязный, поскольку я изменяю numpy.

Как я могу предоставить эту дополнительную библиотеку ссылок gfortran (-lgomp)?

import platform
import setuptools
import numpy
from numpy.distutils.core import setup
from numpy.distutils.misc_util import Configuration


def configuration_openmp(parent_package='', top_path=None):
    config = Configuration('mymodule', parent_package, top_path)
    config.add_extension('mymodule',
                         sources=['mymodule/mymodule.f90'],
                         include_dirs=[numpy.get_include()],
                         extra_f90_compile_args=['-g0', '-O3', '-fopenmp'],
                         )
    config.make_config_py()
    return config
metadata = dict(configuration=configuration_openmp)

setup(**metadata)

Вот код Фортрана

module mod
    subroutine test_openmp()
        use omp_lib
        write(6,*) omp_get_num_procs()
        write(6,*) omp_get_num_threads()
    end subroutine
end module mod

Вот ошибка ссылки

C:\MinGW\bin\gfortran.exe -Wall -g -Wall -g -shared build\temp.win-amd64-3.7\Release\mymodule\mymodule.o build\temp.win-amd64-3.7\Release\build\src.win-amd64-3.7\mymodule\seama
s_integrate-f2pywrappers2.o -LC:\MinGW\lib\gcc\x86_64-w64-mingw32\4.9.2 -L"C:\Program Files\Python37\libs" -L"C:\Program Files\Python37\PCbuild\amd64" -o build\temp.win-amd64-3.7\Release\.libs\libseam
as_i.CCCCCCCCCCCCCCCCCCCCCCCCCCCCC.gfortran-win_amd64.dll -Wl,--allow-multiple-definition -Wl,--output-def,build\temp.win-amd64-3.7\Release\libmymodule_i.CCCCCCCCCCCCCCCCCCCCCCCCCCCCC.gfortran-win
_amd64.def -Wl,--export-all-symbols -Wl,--enable-auto-import -static -mlong-double-64
build\temp.win-amd64-3.7\Release\mymodule\mymodule.o:mymodule.f90:(.text+0xa1): undefined reference to `omp_get_num_procs_'
build\temp.win-amd64-3.7\Release\mymodule\mymodule.o:mymodule.f90:(.text+0xe8): undefined reference to `omp_get_num_threads_'
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/bin/ld.exe: build\temp.win-amd64-3.7\Release\mymodule\mymodule.o: bad reloc address 0x0 in section `.pda
ta'

Возможно, решение заключается в прямом использовании f2py

f2py -m demo --fcompiler=gfortran --f90flags='-O3 -fopenmp' -lgomp -c test.f90
...