2013-05-24 34 views
43

Tôi muốn bọc một dự án thử nghiệm có chứa C++ và mã OpenMP với Cython, và xây dựng nó với các rãnh thông qua tệp setup.py. Nội dung của tập tin của tôi trông như thế này:Làm thế nào để nói cho các distutils sử dụng gcc?

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) 

Cờ -fopenmp được sử dụng với gcc để biên dịch và liên kết chống lại OpenMP. Tuy nhiên, nếu tôi chỉ cần gọi

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

cờ này không được công nhận, bởi vì trình biên dịch là kêu vang:

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 

Tôi đã unsucessfully cố gắng để xác định 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 

thế nào có thể Tôi nói với các distutils sử dụng gcc?

Trả lời

36

Thử đặt biến môi trường "CC" từ bên trong setup.py bằng os.environ.

+13

'os.environ [" CC "] =" g ++ - 4.7 " os.environ [" CXX " ] = "g ++ - 4.7" 'chỉ làm việc – clstaudt

+2

Điều này không hiệu quả đối với tôi. Vấn đề của tôi là 'setup.py' muốn sử dụng' icc'. Khi tôi đặt 'CC = gcc', nó cố gắng sử dụng' gcc', nhưng nó tiếp tục sử dụng các đối số dòng lệnh thích hợp cho 'icc', trong đó có' -fp-model strict' mà 'gcc' không hiểu, và hủy bỏ. Vì vậy, có vẻ như chỉ cần thiết lập 'CC' không phải là cách đúng để làm điều này. – amaurea

+1

Các máy rẽ không * không * kiểm tra CXX, vì vậy việc cài đặt có thể khiến bạn khó hiểu. Bạn có thể muốn xóa đề xuất thêm "CXX" vì nó gây hiểu lầm. – SethMMorton

-1

Hãy thử điều này: http://mail.python.org/pipermail/distutils-sig/2002-August/002944.html

Nói tóm lại, có vẻ như bạn nên thử: python setup.py xây dựng --compiler = g ++ đầu tiên.

+0

Các mặt hàng này quá, nhưng 'python setup.py Êđê dựng --compiler = g ++ 'cho kết quả tương tự như trên. – clstaudt

+0

nếu bạn không chỉ định phiên bản thì sao? –

+0

Trừ khi tôi hiểu lầm bạn, đó là chính xác những gì tôi đã thử. – clstaudt

13

Tôi vừa xem xét nguồn distutils và tùy chọn --compiler hy vọng "unix", "msvc", "cygwin", "mingw32", "bcpp" hoặc "emx". Nó kiểm tra tên trình biên dịch mà bạn muốn bằng cách kiểm tra biến môi trường CC. Thử gọi điện thoại như sau:

CC=gcc python setup.py build 

Bạn không cần đặt CXX, nó không kiểm tra điều đó.

+1

Điều này cũng hoạt động. – clstaudt

+0

Trên ubuntu 12.04 nó thực sự không nhìn vào biến môi trường CXX, đó không phải là điều mong đợi. (có thể là trường hợp nó không kiểm tra trên các nền tảng khác hoặc ofcourse) – hetepeperfan

+0

@hetepeperfan Tôi đang gặp khó khăn trong việc hiểu nhận xét của bạn. Bạn có đồng ý hoặc không đồng ý với câu trả lời này không? – SethMMorton

15

Chỉ trong trường hợp một số người khác đang phải đối mặt cùng một vấn đề hệ điều hành Windows (nơi biến môi trường CC sẽ không có bất kỳ tác):

  • Tạo tập tin "C: \ Python27 \ Lib \ distutils \ distutils.cfg "và viết bên này:

Code:

[build] 
compiler = mingw32 
  • Hủy bỏ tất cả các trường hợp" - MnO-Cygwin" gcc tùy chọn từ tập tin "C: \ Python27 \ Lib \ distutils \ cygwinccompiler.py":

này:

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

trở thành này:

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

Thứ hai điểm có thể cần thiết trong trường hợp bạn đang sử dụng phiên bản gcc gần đây, trong đó tùy chọn không được chấp nhận -mno-cygwin đã bị xóa.

Hy vọng điều này sẽ giúp ngay cả khi nó không liên quan trực tiếp đến các nhu cầu thực sự OP (nhưng vẫn liên quan đến tiêu đề của câu hỏi ...)

+0

Tôi đã thực sự đấu tranh với vấn đề này một vài phút trước nhưng tôi bây giờ rõ ràng Cảm ơn người đàn ông! và tại sao chúng ta lại thêm một tập tin mới vào các rãnh? – thwildfire

+0

Đó là năm 2014 và tôi có phiên bản GCC 4.3.3 và phiên bản Python 3.4. Tôi đã triển khai giải pháp của bạn mà không có kết quả nào. Tôi nhận được lỗi tương tự. Tôi đã viết '[build] compiler = mingw32' vào tệp cấu hình và đã xóa' -mcygwin' ... –

+0

Câu trả lời của tôi có thể đã lỗi thời. Điều đó là hoàn toàn có thể. Tôi xin lỗi nếu đây là trường hợp, nhưng nó đã được một thời gian dài tôi đã không được làm việc trên các chất liệu di động dưới Windows (nghiêm ngặt "Linux làm việc" cho tháng), và thực sự sẽ không thể giúp bạn với điều này, phải Bây giờ ... Đảm bảo rằng bạn đã tạo 'distutils.cfg' ở đúng vị trí (các yêu cầu có thể đã thay đổi đối với tệp này). Bạn đã cố gắng biên dịch bằng cách sử dụng trực tiếp 'python3 setup.py build --compiler = mingw32'? –

-1

Bạn có thể thử cài đặt Anaconda env:

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

xây dựng với:

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