如何在SWIG中使用C++优化标志?
我正在创建一个用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 来编译,那就没问题。你不需要担心重复的优化标志了。