Как указать С++ 11 с distutils?

У меня есть модуль, который необходимо скомпилировать с помощью С++ 11. В GCC и Clang это означает переключатель std=c++11 или std=c++0x для старых компиляторов.

Python не скомпилирован с этим коммутатором, поэтому Distutils не включает его при компиляции модулей.

Каков предпочтительный способ компиляции кода С++ 11 с distutils?

Ответ 1

Вы можете использовать параметр extra_compile_args distutils.core.Extension:

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

Обратите внимание, что это полностью зависит от платформы. Он даже не работает над некоторыми более старыми версиями gcc и clang.

Ответ 2

Вы можете переопределить значения по умолчанию для различных разделов компиляции Distutils и ссылок, используя переменные среды. Это может потребовать некоторых экспериментов в зависимости от того, на какой платформе вы находитесь и как был создан Python. Но в целом переопределение CFLAGS повлияет на фазу компиляции, и один из LDSHARED или LDFLAGS повлияет на фазу связи.

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

или

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

В OS X другой параметр должен использовать переменную среды ARCHFLAGS, которая имеет то преимущество, что не стирает исходные значения CFLAGS или LDSHARED.