如何在distutils中指定C++11?

21 投票
2 回答
10236 浏览
提问于 2025-04-18 04:02

我有一个模块需要用C++11来编译。在GCC和Clang这两个编译器上,这意味着要加上一个叫做std=c++11的选项,或者在旧版编译器上用std=c++0x

不过,Python在编译的时候并没有使用这个选项,所以Distutils在编译模块时不会把它包含进去。

那么,使用Distutils编译C++11代码的最佳方法是什么呢?

2 个回答

3

你可以通过设置环境变量来改变一些Distutils的默认编译和链接选项。这可能需要你根据所使用的平台和Python的构建方式进行一些尝试。不过一般来说,修改CFLAGS会影响编译阶段,而LDSHAREDLDFLAGS中的一个会影响链接阶段。

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

或者

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

在OS X系统上,你还可以使用ARCHFLAGS这个环境变量,它的好处是不会覆盖原来的CFLAGSLDSHARED的值。

20

你可以使用 distutils.core.Extension 里的 extra_compile_args 参数:

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

需要注意的是,这个参数的效果完全依赖于你使用的平台。有些老版本的 gcc 和 clang 甚至都不支持这个参数。

撰写回答