Подтвердить что ты не робот

Как сказать distutils использовать gcc?

Я хочу обернуть тестовый проект, содержащий С++ и OpenMP-код с Cython, и построить его с distutils через файл setup.py. Содержимое моего файла выглядит следующим образом:

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)

Флаг -fopenmp используется с gcc для компиляции и ссылки на OpenMP. Однако, если я просто вызываю

cls ~/workspace/CythonOpenMP/src $ python3 setup.py build

этот флаг не распознается, поскольку компилятор 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

Я решительно пытался указать 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

Как я могу сказать distutils использовать gcc?

4b9b3361

Ответ 1

Попробуйте установить переменную окружения "CC" изнутри setup.py с помощью os.environ.

Ответ 2

На всякий случай некоторые другие сталкиваются с той же проблемой в Windows (где переменная окружения CC не будет иметь никакого эффекта):

  • Создайте файл "C:\Python27\Lib\distutils\distutils.cfg" и напишите это внутри:

Код:

[build]
compiler = mingw32
  • Удалите все экземпляры опции "-mno-cygwin" gcc из файла "C:\Python27\Lib\distutils\cygwinccompiler.py":

Это:

    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))

Становится следующим:

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))

Вторая точка может потребоваться, если вы используете последнюю версию gcc, где устаревшая опция -mno-cygwin была удалена.

Надеюсь, это поможет, даже если оно напрямую не связано с реальными потребностями OP (но все еще связано с заголовком вопроса...)

Ответ 3

Я просто посмотрел на источник distutils, а опция --compiler ожидает "unix", "msvc", "cygwin", "mingw32", "bcpp" или "emx". Он проверяет нужное имя компилятора, проверяя переменную среды CC. Попробуйте создать такую ​​команду:

CC=gcc python setup.py build

Вам не нужно устанавливать CXX, это не проверяет.

Ответ 5

Вы можете попробовать установить anaconda env:

conda create -n py35a python=3.5 numpy scipy matplotlib pandas gcc anaconda

построить с помощью:

zsh -c ". activate py35a && gcc --version && python setup.py build_ext --inplace"