使用gfortran和MSVC在Windows上构建fortran扩展

时间:2015-11-20 08:58:15

标签: python

我正在使用Fortran源开发一个python包。使用gfortran和mingw32(python setup.py build_ext --compiler=mingw32)为Python 2.7,3.3和3.4构建包没有问题。但是,在为Python 3.5构建时,我收到以下错误(有关详细信息,请参阅this build job on AppVeyor):

File "C:\pythontest\lib\distutils\cygwinccompiler.py", line 86, in get_msvcr
    raise ValueError("Unknown MS Compiler version %s " % msc_ver)
ValueError: Unknown MS Compiler version 1900

基于this Python issue我明白用Python 3.5构建mingw32将不可能很快。据我所知,让我可以选择使用msvc编译器(python setup.py build_ext --compiler=msvc)。但是,仍然使用gfortran,我收到以下错误(details here):

checkapexsh.o : error LNK2001: unresolved external symbol _gfortran_st_write
apexsh.o : error LNK2001: unresolved external symbol _gfortran_st_write
magfld.o : error LNK2001: unresolved external symbol _gfortran_st_write
apex.o : error LNK2001: unresolved external symbol _gfortran_st_write
makeapexsh.o : error LNK2001: unresolved external symbol _gfortran_st_write
apexsh.o : error LNK2001: unresolved external symbol _gfortran_transfer_character_write
checkapexsh.o : error LNK2001: unresolved external symbol _gfortran_transfer_character_write
checkapexsh.o : error LNK2001: unresolved external symbol _gfortran_st_write_done
apexsh.o : error LNK2001: unresolved external symbol _gfortran_st_write_done
magfld.o : error LNK2001: unresolved external symbol _gfortran_st_write_done
apex.o : error LNK2001: unresolved external symbol _gfortran_st_write_done
makeapexsh.o : error LNK2001: unresolved external symbol _gfortran_st_write_done
apexsh.o : error LNK2001: unresolved external symbol _gfortran_runtime_error_at
[et cetera]

这就是我选择首先使用MinGW的原因。但是,我也想支持Python> = 3.5。有没有什么办法可以在Windows上用gfortran和MSVC编译fortran扩展并避免上面的错误?或者,是否有其他(免费)fortran编译器,我可以使用它与MSVC很好玩? (我很难找到任何东西。)

如果相关,here's a permanent link to my current setup.py

1 个答案:

答案 0 :(得分:1)

从python.org或mingw-w64 gfortran的任何发布版本发布的任何CPython 3.5版本都不可能。一旦mingwpy(http://mingwpy.github.io/)项目进一步发展,这将有可能使用python.org版本的CPython 3.5。这可能在Anaconda Python的3.5发行版中有可能,但我不确定。

您现在可以尝试的替代方法是从https://msys2.github.io/安装MSYS2,然后使用pacman安装CPython 3.5的mingw-w64-python3发行版。这个版本的Python本身是用MinGW-w64 GCC构建的,因此没有与python.org构建的CPython相同的MSVC-vs-GCC兼容性问题。但是,如果您尝试下载或编译使用MSVC构建的二进制包,则会遇到问题。可以配置来自此MSYS2 Python发行版的pip版本以避免下载MSVC二进制文件,而是默认使用MSYS2 mingw-w64-gcc(以及用于f2py的mingw-w64-gcc-fortran)编译器从源构建包。