2014-04-24 20 views
10

Mam moduł, który musi być skompilowany z C++ 11. W GCC i Clang oznacza to przełącznik std=c++11 lub std=c++0x na starszych kompilatorach.Jak określić C++ 11 za pomocą distutils?

Python nie jest skompilowany z tym przełącznikiem, więc Distutils nie uwzględnia go podczas kompilowania modułów.

Jaki jest preferowany sposób kompilowania kodu C++ 11 za pomocą distutils?

Odpowiedz

8

Można użyć parametru extra_compile_args z distutils.core.Extension:

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

pamiętać, że jest całkowicie zależne od platformy. Nie działa nawet w starszych wersjach gcc i clang.

+0

Uważałem, że cały punkt distutils polega na unikaniu "całkowitej zależności od platformy". Odkąd rozprowadzam bibliotekę, która musi być kompilowana lokalnie na komputerze użytkownika końcowego, naprawdę potrzebuję czegoś niezależnego od platformy. – Adam

+0

@Adam To jest częścią punktu 'distutils', ale gdy już skompiluje kod, staje się to skomplikowane, więc daje ci te uchwyty do robienia specyficznych dla platformy rzeczy. Możesz zrobić sprytne rzeczy w swoim 'setup.py', aby wybrać właściwe dla danej platformy rzeczy dla zestawu popularnych platform. Ale nie ma uniwersalnego sposobu określania C++ 11 i istnieje wiele maszyn, które nie mają jeszcze kompilatorów, które go obsługują. – juanchopanza

+0

czy możesz wskazać mi, co pociągnęłoby za sobą "sprytne rzeczy"? – Adam

1

Można zastąpić wartości domyślne dla różnych kompilacji Distutils i flag łączy przy użyciu zmiennych środowiskowych. Może to wymagać pewnych eksperymentów w zależności od platformy, na której się znajdujesz i sposobu, w jaki Python, z którego korzystałeś został zbudowany. Ale zwykle przesłonięcie CFLAGS wpłynie na fazę kompilacji i albo jedna z LDSHARED lub LDFLAGS wpłynie na fazę łącza.

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

lub

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

Na OS X, innym rozwiązaniem jest użycie zmiennej środowiskowej ARCHFLAGS który ma tę zaletę, że nie unicestwiając oryginalne CFLAGS lub LDSHARED wartości.

Powiązane problemy