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
'IT이야기' 카테고리의 다른 글
정적 가상 기능을 가질 수 있습니까? (0) | 2021.09.17 |
---|---|
파이썬에서 "컨테이너"란 정확히 무엇입니까? (0) | 2021.09.17 |
최대 절전 모드: 일대일 지연 로딩, 선택 사항 = false (0) | 2021.09.17 |
JSON을 LINQ할 수 있습니까? (0) | 2021.09.17 |
ReactJS this.state null (0) | 2021.09.16 |