您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用调试Python安装在Windows上构建Python-C-Extension

使用调试Python安装在Windows上构建Python-C-Extension

pythonXY.lib在Windows上,针对的链接有点偷偷摸摸。当您查看用于链接的命令行时,您会看到没有python库传递给链接器,即’link.exe’。注意:对于Linux也是如此,但是在Linux上则不必这样做,因为所需的符号将由python- executable提供。

但是,很容易通过来检查是否 dumpbin /dependents resulting.pyd存在依赖关系pythonXY.dll,并且还extra_link_args = ["/VERBOSE:LIB"]对扩展定义进行了添加,并且触发链接器的详细模式将显示链接器使用pythonXY.lib

偷偷摸摸的部分:Microsoft Compler具有便利的编译指示,#pragma comment(lib, ...)可以自动触发库的链接,该链接也用在Python标头中

#               if defined(_MSC_VER)
                        /* So MSVC users need not specify the .lib
                        file in their Makefile (other compilers are
                        generally taken care of by distutils.) */
#                       if defined(_DEBUG)
#                               pragma comment(lib,"python39_d.lib")
#                       elif defined(Py_LIMITED_API)
#                               pragma comment(lib,"python3.lib")
#                       else
#                               pragma comment(lib,"python39.lib")
#                       endif /* _DEBUG */
#               endif /* _MSC_VER */

如您所见,要链接到调试版本,需要定义_DEBUG

_DEBUGdistutilsWindows自动定义,如果build_ext通过options调用--debug,例如

python setup.py build_ext -i --debug

可以翻译pip

pip install --global-option build --global-option --debug XXXXX

它可以大致解释为:触发build命令(还包括build_ext-command),--debug在安装前带有选项。

构建调试C扩展时的另一种功能在Windows上还有更多功能

#ifdef _DEBUG
#       define Py_DEBUG
#endif

Python3.8之前定义 Py_DEBUG宏意味着无与伦比的ABI ,因为它还假设这会导致发布模式的不同内存布局以及某些其他功能缺失。Py_TRACE_REFSPyObject

但是,从python3.8开始,通过提供缺少的pythonXY_d.lib/pythonyX.lib作为链接到另一个版本的符号链接,可能可以摆脱它。

python 2022/1/1 18:30:36 有408人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶