Distutils - 如何在构建扩展时禁用包含调试符号

Jas*_*ock 5 python distutils

我写了一个boost-python扩展,目前正在通过distutils构建.

遗憾的是,我无法在distutils中找到一种方法来构建没有调试符号的扩展,或者在安装时从扩展中剥离符号.
注意:我没有传递--debug或-g来构建distutils的命令(例如,python setup.py build),而我的编译器是Linux上的gcc.

示例setup.py:

from distutils.core import setup
from distutils.extension import Extension

setup(name="myPy",
      ext_modules = [
         Extension("MyPyExt", ["MyPyExt.cpp"],
                   libraries = ["boost_python"])
      ])
Run Code Online (Sandbox Code Playgroud)

Wrz*_*mft 8

您可以使用该选项extra_compile_args将参数传递给最后附加的编译器,从而具有最高优先级.因此,如果包含-g0(无调试符号),则会extra_compile_args覆盖-gDistutils/Setuptools 的设置.在你的例子中:

from distutils.core import setup
from distutils.extension import Extension

setup(
    name="myPy",
    ext_modules = [Extension(
        "MyPyExt",
        ["MyPyExt.cpp"],
        libraries = ["boost_python"],
        extra_compile_args = ["-g0"]
        )]
    )
Run Code Online (Sandbox Code Playgroud)

另请参阅:我如何覆盖setup.py默认使用的编译器(gcc)标志?


hit*_*wen 5

我找到了一种方法,但有点笨拙:

from distutils import sysconfig
from distutils.core import setup
import platform


if platform.system() != 'Windows':  # When compilinig con visual no -g is added to params
    cflags = sysconfig.get_config_var('CFLAGS')
    opt = sysconfig.get_config_var('OPT')
    sysconfig._config_vars['CFLAGS'] = cflags.replace(' -g ', ' ')
    sysconfig._config_vars['OPT'] = opt.replace(' -g ', ' ')

if platform.system() == 'Linux':  # In macos there seems not to be -g in LDSHARED
    ldshared = sysconfig.get_config_var('LDSHARED')
    sysconfig._config_vars['LDSHARED'] = ldshared.replace(' -g ', ' ')

setup(...)
Run Code Online (Sandbox Code Playgroud)