Я использую 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