“后缀或操作数对'movq'无效的原因”?

时间:2016-02-09 17:20:40

标签: python macos fortran gfortran setup.py

我正在尝试安装一个名为mtspec的python包,它是一些Fortran 90代码的包装器。 (链接:https://pypi.python.org/pypi/mtspec)。但是,这个软件包相当陈旧(最后一次更新于2010年),我无法使用setup.py脚本在Mac OSX 10.10.5上正确编译代码。由于setup.py中的一些明显变化,我不得不自己破解distutils脚本。最初,setup.py中的第48行看起来像这样:

from distutils.unixccompiler import UnixCCompiler, _darwin_compiler_fixup

我改为

from distutils.unixccompiler import UnixCCompiler#, _darwin_compiler_fixup
from _osx_support import compiler_fixup as _darwin_compiler_fixup

如果没有这个,setup.py只会抛出异常cannot import name _darwin_compiler_fixup。我对distutils了解不多,所以请告诉我这是不是错了。但是在更改之后它至少会尝试编译代码。但是,gfortran现在会抛出以下错误:

/var/folders/vt/9jwlypbs5rz8hy6d_h02pg8xg967kg/T//ccm4Gy5y.s:25:suffix or  operands invalid for `movq'
/var/folders/vt/9jwlypbs5rz8hy6d_h02pg8xg967kg/T//ccm4Gy5y.s:27:suffix or operands invalid for `movq'
/var/folders/vt/9jwlypbs5rz8hy6d_h02pg8xg967kg/T//ccm4Gy5y.s:28:suffix or operands invalid for `movq'
/var/folders/vt/9jwlypbs5rz8hy6d_h02pg8xg967kg/T//ccm4Gy5y.s:34:suffix or operands invalid for `movq'
/var/folders/vt/9jwlypbs5rz8hy6d_h02pg8xg967kg/T//ccm4Gy5y.s:79:suffix or operands invalid for `movq'
/var/folders/vt/9jwlypbs5rz8hy6d_h02pg8xg967kg/T//ccm4Gy5y.s:115:suffix or operands invalid for `movq'

我对Fortran不是很有经验,所以我不知道这意味着什么,并且在StackOverflow和Google上搜索没有找到任何解决这个问题的方法。我在另一个网站上看到的一条建议(不记得我在哪里看到这个)建议删除-O编译器标志,但这会使问题变得更糟;错误更频繁地被抛出。在setup.py虚拟环境中运行conda也无济于事。我现在不知道该做什么。我之前已经在Cray Linux和Red Hat Linux上安装了这个软件包,只需在setup.py中简单地注释掉所有对Darwin的引用;只有Mac才给我带来麻烦。

如果它有帮助,这里是配置编译器的setup.py中的代码块:

from distutils.unixccompiler import UnixCCompiler#, _darwin_compiler_fixup
from _osx_support import compiler_fixup as _darwin_compiler_fixup
# Monkey patch UnixCCompiler for Unix, Linux and darwin
UnixCCompiler.src_extensions.append(".f90")
def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
        compiler_so = self.compiler_so
        if sys.platform == 'darwin':
            compiler_so = _darwin_compiler_fixup(compiler_so, cc_args + extra_postargs)
        if ext == ".f90":
            if sys.platform == 'darwin' or sys.platform == 'linux2':
                compiler_so = ["gfortran"]
                cc_args = ["-O", "-fPIC", "-c", "-ffree-form"]
        try:
            self.spawn(compiler_so + cc_args + [src, '-o', obj] + extra_postargs)
        except DistutilsExecError, msg:
            raise CompileError, msg
UnixCCompiler._compile = _compile
# set library dir for mac and linux
libs=['gfortran']

1 个答案:

答案 0 :(得分:4)

因为你提到它只会给Mac造成麻烦。可能是你的机器上安装了macports和homebrew吗?

我遇到了编译不同库的相同错误,以下链接为我解决了这个问题:https://github.com/Homebrew/legacy-homebrew/issues/45258

删除macports后(例如sudo mv / opt / local~ / macport)一切正常。