python कैसे जीसीसी का उपयोग करने के लिए distutils बताने के लिए?




compiler-errors cython (4)

मैं C ++ के साथ C ++ और OpenMP कोड वाली एक परीक्षण परियोजना को लपेटना चाहता हूं, और इसे सेटअप- 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)

OpenMP के खिलाफ संकलन और लिंक करने के लिए -fopenmp ध्वज को gcc के साथ प्रयोग किया जाता है। हालांकि, अगर मैं सिर्फ आह्वान करता हूं

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

यह ध्वज पहचाना नहीं गया है, क्योंकि संकलक क्लैंग है:

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

मैं जीसीसी का उपयोग करने के लिए डिस्टुटिल्स को कैसे बता सकता हूं?

https://code.i-harness.com


Os.environ के साथ सेटअप के अंदर से "CC" पर्यावरण चर सेट करने का प्रयास करें।


इसे आज़माएँ: http://mail.python.org/pipermail/distutils-sig/2002-August/002944.html

संक्षेप में, ऐसा प्रतीत होता है कि आपको पहले प्रयास करना चाहिए: अजगर सेटअप-थ्रू बिल्ड - माइक्रोमैक्स / जी ++ पहले।


बस मामले में कुछ अन्य लोगों को विंडोज के तहत एक ही समस्या का सामना करना पड़ रहा है (जहां सीसी पर्यावरण चर का कोई प्रभाव नहीं होगा):

  • फ़ाइल बनाएं "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))

यदि आप gcc के हालिया संस्करण का उपयोग कर रहे हैं, तो दूसरा बिंदु आवश्यक हो सकता है, जहाँ -mno-cygwin गए विकल्प -mno-cygwin को हटा दिया गया है।

आशा है कि यह मदद करेगा भले ही यह सीधे ओपी वास्तविक जरूरतों से संबंधित न हो (लेकिन अभी भी प्रश्न के शीर्षक से संबंधित है ...)


मैंने सिर्फ --compiler स्रोत पर एक नज़र --compiler , और - --compiler विकल्प "यूनिक्स", "एमएससीईवी", "साइबरविन", "मिंगवॉ 32", "बीसीपीपी", या "एमएक्स" की उम्मीद करता है। यह संकलक नाम की जाँच करता है जिसे आप CC पर्यावरण चर की जाँच करके चाहते हैं। इस तरह से कॉलिंग का प्रयास करें:

CC=gcc python setup.py build

आपको CXX सेट करने की आवश्यकता नहीं है, यह उसके लिए जाँच नहीं करता है।





distutils