8

我编写了一个 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"])
      ])
4

3 回答 3

10

您可以使用该选项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"]
        )]
    )

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

于 2016-06-21T18:49:36.980 回答
5

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

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(...)
于 2014-02-05T12:15:23.040 回答
0

@hithwen 的解决方案适用于 python3.5,由 MacPorts 安装,在 MacOS 10.13.4 上运行。

但是,在我的情况下,platform.system()返回'Darwin',而不是 'Linux'。
在 Ubuntu 16.04 上,-g似乎出现在开头或结尾。所以稍微调整了一下:

import sys
import re
from distutils import sysconfig
from distutils.core import setup, Extension

if sys.platform == 'linux' or sys.platform == 'darwin':
  sysconfig.get_config_var(None)  # to fill up _config_vars
  d = sysconfig._config_vars
  for x in ['OPT', 'CFLAGS', 'PY_CFLAGS', 'PY_CORE_CFLAGS', 'CONFIGURE_CFLAGS', 'LDSHARED']:
    d[x] = re.sub(' -g ', ' ', d[x])
    d[x] = re.sub('^-g ', '',  d[x])
    d[x] = re.sub(' -g$', '',  d[x])

setup(...)

谢谢@hithwen!

于 2018-05-02T14:01:26.953 回答