如何在SWIG中使用C++优化标志?

4 投票
2 回答
2109 浏览
提问于 2025-04-16 19:31

我正在创建一个用C++实现的Python模块。我使用SWIG来创建接口。创建这个扩展有很多方法,我选择了“推荐的方法”,也就是通过Python的distutils,具体的说明可以在这里找到。我的模块名字叫“ParseEvents”,为了编译它,我运行了以下两个命令:

swig -c++ -python ParseEvents.i
python setup.py build_ext --inplace

第一个命令会生成一个名为ParseEvents_wrap.cxx的文件。

第二个命令使用了以下的setup.py文件:

from distutils.core import setup, Extension

ParseEvents_module = Extension('_ParseEvents',
                               sources=['ParseEvents_wrap.cxx',],
                               extra_compile_args=["-Wno-deprecated","-O3"],
                               )
setup (name = 'ParseEvents',
              ext_modules = [ParseEvents_module,],
              py_modules = ["ParseEvents"]
              )

问题:我在哪里以及如何指定我的C++代码要用 -O3 编译标志进行编译呢?我猜应该是在setup.py文件的“extra_compile_args”部分,但似乎并不是这样。当我运行第二个命令(python setup.py build_ext --inplace)时,输出结果是:

running build_ext
building '_ParseEvents' extension
creating build
creating build/temp.linux-x86_64-2.6
gcc -pthread -fno-strict-aliasing -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fPIC -I/usr/include/python2.4 -c ParseEvents_wrap.cxx -o build/temp.linux-x86_64-2.4/ParseEvents_wrap.o -Wno-deprecated -O3
c++ -pthread -shared build/temp.linux-x86_64-2.4/ParseEvents_wrap.o -o _ParseEvents.so

注意输出的倒数第二行中同时出现了 -O2 和 -O3 标志——我想去掉 -O2。

2 个回答

0

Distutils 有一个很棒的功能,就是提供了与 Python 编译时使用的所有相同的标志。这意味着添加额外的标志很简单,但要删除它们就非常麻烦。要做到这一点,你需要创建一个新的编译器类,捕捉到这些参数,然后手动把那些不需要的标志从编译函数使用的参数列表中移除。这是理论上的说法,实际上文档写得很糟糕,根本没有指导你该怎么做。

不过,就像路德说的,在你的情况下,额外的 -O2 其实并不会造成什么问题。

3

GCC的文档里明确说明:

http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Optimize-Options.html

如果你使用多个 -O 选项,不管有没有后面的数字,最后一个选项才是有效的。

这就是说,如果你想让你的代码用 -O3 来编译,那就没问题。你不需要担心重复的优化标志了。

撰写回答