IT이야기

distutils에게 gcc를 사용하도록 지시하는 방법은 무엇입니까?

cyworld 2021. 9. 17. 21:33
반응형

distutils에게 gcc를 사용하도록 지시하는 방법은 무엇입니까?


C++ 및 OpenMP 코드가 포함된 테스트 프로젝트를 Cython으로 래핑하고 setup.py파일을 통해 distutils로 빌드하고 싶습니다 . 내 파일의 내용은 다음과 같습니다.

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플래그의 OpenMP에 대한 컴파일하려면 gcc가 링크와 함께 사용됩니다. 그러나 내가 호출하면

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를 사용하도록 어떻게 알릴 수 있습니까?


os.environ을 사용하여 setup.py 내부에서 "CC" 환경 변수를 설정해 보십시오.


다른 사람들이 Windows에서 동일한 문제에 직면하는 경우를 대비하여(CC 환경 변수가 영향을 미치지 않는 경우):

  • "C:\Python27\Lib\distutils\distutils.cfg" 파일을 만들고 다음과 같이 작성합니다.

코드:

[build]
compiler = mingw32
  • "C:\Python27\Lib\distutils\cygwinccompiler.py" 파일에서 "-mno-cygwin" gcc 옵션의 모든 인스턴스를 제거합니다.

이것 :

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

더 이상 사용되지 않는 옵션 -mno-cygwin이 제거 된 최신 버전의 gcc를 사용하는 경우 두 번째 포인트가 필요할 수 있습니다 .

이것이 OP 실제 요구와 직접 관련이 없는 경우에도 도움이 되기를 바랍니다(그러나 여전히 질문의 제목과 관련이 있습니다...)


방금 distutils소스를 살펴보았고 --compiler옵션은 "unix", "msvc", "cygwin", "mingw32", "bcpp" 또는 "emx"를 예상합니다. CC환경 변수 를 확인하여 원하는 컴파일러 이름을 확인합니다 . 다음과 같이 빌드를 호출해 보십시오.

CC=gcc python setup.py build

설정할 필요 CXX가 없으며 확인하지 않습니다.


According to this wiki, Python versions after 3.4 do not support MinGW anymore. CPython 3.7 for Windows is compiled with MSC v.1916. When I try to use above-mentioned method with distutils.cfg, I then get an error from distutils: Unknown MS Compiler Version 1916. Looks like it has a hardcoded table of msvcr libraries in its cygwincompiler.py file (which is also responsible for MinGW), and last version known to that file is 1600 from VS2010 / MSVC 10.0.


Try this: http://mail.python.org/pipermail/distutils-sig/2002-August/002944.html

In short, it appears that you should try: python setup.py build --compiler=g++ first.

ReferenceURL : https://stackoverflow.com/questions/16737260/how-to-tell-distutils-to-use-gcc

반응형