【问题标题】:Distutils - How to disable including debug symbols when building an extensionDistutils - 如何在构建扩展时禁用包含调试符号
【发布时间】:2012-10-20 01:06:47
【问题描述】:

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

【问题讨论】:

  • 您可以将extra_link_args=['-Wl,--strip-all'] 添加到Extension。不可移植,而且奇怪的是,Windows 上的 MinGW64 默认会剥离生成的模块,但 Linux 上的 gcc 不会。
  • 哎呀,对不起,MinGW默认也不包含它,它只在我的setup.py中指定。
  • 好的。我会试试看。周末我浏览了一些 distutils 包,但我无法确定默认的地方。从我所看到的一切来看,它看起来不应该是这样。
  • 默认的是在调用 gcc 时使用 '-g' 来构建调试,而无需我将 --debug 或 -g 传递给 'python setup.py build/install'。跨度>

标签: python distutils


【解决方案1】:

@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!

【讨论】:

    【解决方案2】:

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

    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"]
            )]
        )
    

    另见:How may I override the compiler (gcc) flags that setup.py uses by default?

    【讨论】:

      【解决方案3】:

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

      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(...)
      

      【讨论】:

      • 考虑到我已经看到使用 iMake 和 cmake 完成的事情,这对我来说并没有那么糟糕。我将假设它可以工作,因为我无法再访问我尝试执行此操作的原始代码。
      • 谢谢@hithwen,它适用于python3.5,由MacPorts安装,在MacOS 10.13.4上运行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 2012-02-10
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多