2014-04-24 24 views
10

C++ 11 ile derlenmesi gereken bir modülüm var. GCC ve Clang'de, eski derleyicilerde std=c++11 anahtar veya std=c++0x anlamına gelir.C++ 11 distutils ile nasıl belirtilir?

Python bu anahtarla derlenmez; bu nedenle, modüllerin oluşturulmasında Distutils buna dahil değildir.

C++ 11 kodunu dağıtmak için tercih edilen yol nedir?

cevap

8

Sen distutils.core.Extension ait extra_compile_args parametresini kullanabilirsiniz. Gcc ve clang'ın bazı eski sürümlerinde bile çalışmayacak.

+0

Bütün dağıtım noktalarının "tamamen platforma bağımlı" olmaktan kaçınmak olduğunu sanmıştım. Son kullanıcının makinesinde yerel olarak derlenmesi gereken bir kütüphane dağıttığım için, gerçekten platformdan bağımsız bir şeye ihtiyacım var. – Adam

+0

@Adam Bu, 'dağınıklıkların' noktasının bir parçasıdır, ancak kodları doğal olarak derlediğimizde bu karmaşıklaşır, bu yüzden size bu tutamaçları platforma özgü şeyler yapmak için verir. Bir dizi popüler platform için doğru platformlara özel şeyler seçmek için 'setup.py' öğesinde akıllıca şeyler yapabilirsiniz. Ancak, C++ 11'i belirtmenin evrensel bir yolu yok, ve henüz desteklemeyen derleyicileri olmayan birçok makine var. – juanchopanza

+0

Bu "zeki şeylerin" neye yol açacağına işaret edebilir misin? – Adam

1

Ortam değişkenlerini kullanarak çeşitli Distutils derleme ve bağlantı bayraklarının varsayılan değerlerini geçersiz kılabilirsiniz. Bu, hangi platformda olduğunuza ve kullandığınız Python'un nasıl yapıldığına bağlı olarak bazı denemeler gerektirebilir. Ancak genellikle CFLAGS'u geçersiz kılmak, derleme aşamasını etkileyecek ve LDSHARED veya LDFLAGS'dan biri bağlantı aşamasını etkileyecektir.

export CFLAGS='-std=c++11' 
pip install blah 

veya OS X

export CFLAGS='-std=c++11' 
python setup.py install 

, başka bir seçenek, orijinal CFLAGS veya LDSHARED değerlerini silerek avantajına sahiptir ARCHFLAGS ortam değişkeni kullanmaktır. Bu tamamen platform bağımlı olduğunu

ext = Extension('foo', sources=[....], 
       libraries=[....], 
       extra_compile_args=['-std=c++11'], 
       ....) 

Not: