Compilar com cython e mingw produz gcc: erro: opção de linha de comando não reconhecida '-mno-cygwin'

114

Estou tentando compilar uma extensão python com cython no win 7 de 64 bits usando o mingw (64 bits).
Estou trabalhando com Python 2.6 (Active Python 2.6.6) e com o arquivo distutils.cfg adequado (definindo mingw como compilador)

Ao executar

> C:\Python26\programas\Cython>python setup.py build_ext --inplace

Recebo um erro dizendo que o gcc não tem uma opção -mno-cygwin:

> C:\Python26\programas\Cython>python setup.py build_ext --inplace
running build_ext
skipping 'hello2.c' Cython extension (up-to-date)
building 'hello2' extension
C:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\Python26\include -IC:\Python26\PC -c hello2.c -o build\temp.win-amd64-2.6\Release\hello2.o
gcc: error: unrecognized command line option '-mno-cygwin'
error: command 'gcc' failed with exit status 1

gcc é:

C:\>gcc --version
gcc (GCC) 4.7.0 20110430 (experimental)
Copyright (C) 2011 Free Software Foundation, Inc.

Como eu poderia consertar?

joaquin
fonte
Aqui está um link ! Isso resolve o problema com o último Cython e MingW
Indrajit Kanjilal

Respostas:

181

Parece que o GCC 4.7.0 finalmente removeu a -mno-cygwinopção obsoleta , mas distutils ainda não a atualizou. Instale uma versão um pouco mais antiga do MinGW ou edite distutils\cygwinccompiler.pyem seu diretório Python para remover todas as instâncias de -mno-cygwin.

Ignacio Vazquez-Abrams
fonte
10
Obrigado Ignacio. Já tentei essa solução sozinho (para eliminar -mno-cygwin de cygwinccompyler). O erro desapareceu, mas recebi um erro diferente com ld. Mas esta é uma questão diferente. Vou postar amanhã. Agora preciso descansar ... por que é tão difícil compilar no windows?
joaquin de
7
Isto é o que funcionou para mim. Segui literalmente as instruções de Ignacio. Substituídas 4 ocorrências da string "-mno-cygwin" por "" no arquivo cygwincompile.py
Ram Narasimhan
4
@joaquin: Você conseguiu classificar o lderro que obteve? Encontrei o mesmo erro e estou lutando para classificá-lo.
robintw
@robintw sim, eu fiz. Postei uma receita naquele momento (e achei!). Consulte editar
joaquin
2
Python 2.7.9 resolveu esse problema. Python 2.7.8 ainda tem.
fx-kirin
11

Durante o processo de resolução desses e dos seguintes problemas que encontrei, escrevi uma receita neste tópico . Eu reproduzo aqui caso possa ser útil para outros:


Receita passo a passo para compilar extensões cython de 64 bits com python 2.6.6 com compilador mingw no win 7 de 64 bits

Instale o compilador mingw
1) Instale tdm64-gcc-4.5.2.exe para compilação de 64 bits

Aplique o patch a python.h
2) Modifique python.h em C: \ python26 \ include conforme indicado em http://bugs.python.org/file12411/mingw-w64.patch

Modificar distutils
Editar 2013: Observe que em python 2.7.6 e 3.3.3 -mno-cygwin foi finalmente removido, então a etapa 3 pode ser ignorada .

3) Elimine todos os parâmetros -mno-cygwin da chamada para gcc na classe Mingw32CCompiler em Python26 \ Lib \ distutils \ cygwinccompiler.py
4) No mesmo módulo, modifique get_msvcr () para retornar uma lista vazia em vez de ['msvcr90 '] quando msc_ver ==' 1500 '.

Produza o arquivo libpython26.a (não incluído no python de 64 bits)
Editar 2013: as seguintes etapas 5 a 10 podem ser ignoradas baixando e instalando libpython26.a de gohlke .

5) Obtenha gendef.exe de mingw-w64-bin_x86_64- mingw_20101003_sezero.zip (gendef.exe não está disponível na distribuição tmd64. Outra solução é compilar gendef da fonte ...)
6) Copiar python26.dll (localizado em C \ windows \ system32) para o diretório do usuário (C: \ Users \ myname)
7) Produza o arquivo python26.def com:

gendef.exe C: \ Users \ myname \ python26.dll

8) Mova o arquivo python.def produzido (localizado na pasta de onde gendef foi executado) para o diretório do usuário
9) Produza o libpython.a com:

dlltool -v --dllname python26.dll --def C: \ Users \ myname \ python26.def --output-lib C: \ Users \ myname \ libpython26.a

10) Mova o libpython26.a criado para C: \ Python26 \ libs

Produza sua extensão .pyd
11) Crie um arquivo de teste hello.pyx e um arquivo setup.py conforme indicado no tutorial cython ( http://docs.cython.org/src/quickstart/build.html )
12) Compile com

python setup.py build_ext --inplace

Feito!

joaquin
fonte
Fiz a etapa 1 no win64 python27. Então tentei e cython instalado com sucesso. Eu não tinha ideia do que fazer com o patch na etapa 2.
craastad
@Chris Raastad. Interessante. Mas não se trata de instalar o cython, mas sim de compilar um script. Não tenho certeza se você quis dizer isso. De qualquer forma, há dois dias houve um comentário de robintw sobre o erro de ld. Então, se você realmente tem o mingw funcionando, talvez dependa da versão que você instalou e talvez das bibliotecas que você já instalou que você usa na primeira tentativa ou fica preso com erros.
joaquin
1
+1 Esta é uma resposta útil. Para extensões usando numpy, também tive que hackear opções dentro da numpy/distutilspasta, tanto para mingw32compiler.py.
Caleb Hattingh
Em python27 parece que você tem que definir MS_WIN64 adicionando-o ao arquivo cygwinccompiler.py. Veja aqui: stackoverflow.com/a/19867426/2136991
David
@David na questão que você vincula ao OP se refere a python26, não a python27. Seguiu exatamente a minha receita e ainda precisou fazer a alteração que referiu?
joaquin