¿Cómo decirle a distutils que use gcc?
Quiero envolver un proyecto de prueba que contenga código C++ y OpenMP con Cython, y compilarlo con distutils a través de un archivo setup.py
. El contenido de mi archivo se ve así:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
modules = [Extension("Interface",
["Interface.pyx", "Parallel.cpp"],
language = "c++",
extra_compile_args=["-fopenmp"],
extra_link_args=["-fopenmp"])]
for e in modules:
e.cython_directives = {"embedsignature" : True}
setup(name="Interface",
cmdclass={"build_ext": build_ext},
ext_modules=modules)
La bandera -fopenmp
se usa con gcc para compilar y enlazar contra OpenMP. Sin embargo, si solo invoco
cls ~/workspace/CythonOpenMP/src $ python3 setup.py build
Esta bandera no se reconoce, porque el compilador es clang:
running build
running build_ext
skipping 'Interface.cpp' Cython extension (up-to-date)
building 'Interface' extension
cc -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c Interface.cpp -o build/temp.macosx-10.8-x86_64-3.3/Interface.o -fopenmp
clang: warning: argument unused during compilation: '-fopenmp'
cc -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c Parallel.cpp -o build/temp.macosx-10.8-x86_64-3.3/Parallel.o -fopenmp
clang: warning: argument unused during compilation: '-fopenmp'
Parallel.cpp:24:10: warning: unknown pragma ignored [-Wunknown-pragmas]
#pragma omp parallel for
^
1 warning generated.
c++ -bundle -undefined dynamic_lookup -L/usr/local/lib -L/usr/local/opt/sqlite/lib build/temp.macosx-10.8-x86_64-3.3/Interface.o build/temp.macosx-10.8-x86_64-3.3/Parallel.o -o build/lib.macosx-10.8-x86_64-3.3/Interface.so -fopenmp
ld: library not found for -lgomp
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'c++' failed with exit status 1
He tratado sin escrúpulos de especificar gcc:
cls ~/workspace/CythonOpenMP/src $ python3 setup.py build --compiler=g++-4.7
running build
running build_ext
error: don't know how to compile C/C++ code on platform 'posix' with 'g++-4.7' compiler
¿Cómo puedo decirle a distutils que use gcc?
5 answers
Intente configurar la variable de entorno" CC " desde el interior del setup.py con os.environ.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-23 15:52:49
En caso de que otros se enfrenten al mismo problema en Windows (donde la variable de entorno CC no tendría ningún efecto):
- Crear archivo "C:\Python27\Lib\distutils\distutils.cfg " y escribe esto dentro:
Código:
[build]
compiler = mingw32
- Elimine todas las instancias de" - mno-cygwin " opción gcc del archivo "C:\Python27\Lib\distutils\cygwinccompiler.py":
Esto:
self.set_executables(compiler='gcc -mno-cygwin -O -Wall',
compiler_so='gcc -mno-cygwin -mdll -O -Wall',
compiler_cxx='g++ -mno-cygwin -O -Wall',
linker_exe='gcc -mno-cygwin',
linker_so='%s -mno-cygwin %s %s'
% (self.linker_dll, shared_option,
entry_point))
Se convierte en esto:
self.set_executables(compiler='gcc -O -Wall',
compiler_so='gcc -mdll -O -Wall',
compiler_cxx='g++ -O -Wall',
linker_exe='gcc',
linker_so='%s %s %s'
% (self.linker_dll, shared_option,
entry_point))
El segundo punto puede ser necesario en caso de está utilizando una versión reciente de gcc, donde se ha eliminado la opción en desuso -mno-cygwin
.
Espero que esto ayude incluso si no está directamente relacionado con las necesidades reales de OP (pero aún relacionado con el título de la pregunta...)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-24 17:09:43
Acabo de echar un vistazo a la fuente distutils
, y la opción --compiler
espera "unix", "msvc", "cygwin", "mingw32", "bcpp", o "emx". Comprueba el nombre del compilador que desea marcando la variable de entorno CC
. Intenta llamar a build de esta manera:
CC=gcc python setup.py build
No es necesario establecer CXX
, no comprueba eso.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-24 14:43:58
Prueba esto: http://mail.python.org/pipermail/distutils-sig/2002-August/002944.html
En resumen, parece que deberías probar: python setup.py build comp compiler = g++ primero.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-24 14:28:01
Puede intentar instalar anaconda env:
conda create -n py35a python=3.5 numpy scipy matplotlib pandas gcc anaconda
Construir con:
zsh -c ". activate py35a && gcc --version && python setup.py build_ext --inplace"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-22 10:21:47