我使用numpy在Windows上使用MSVC和gfortran创建由fortran 90代码组成的模块。这个想法是用python setup.py bdist_wheel
创建一个轮子。
我使用以下python代码创建模块。一切都可以编译,运行良好,直到我使用了像openmp(-lgomp
)这样的gfortran库。我设法用-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)
这是fortran代码
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