[在Windows上使用调试Python安装来构建Python-C扩展

问题描述 投票:1回答:1

如果我从Windows上的源代码构建CPython,则当我要点安装包含C-Extension的软件包时会遇到问题。似乎在链接库时发生错误。

例如,在安装cython时(但在其他C扩展包上也因相同的错误而崩溃:]

LINK:致命错误LNK1104:无法打开文件'python38.lib'

错误:命令'C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Enterprise \ VC \ Tools \ MSVC \ 14.23.28105 \ bin \ HostX86 \ x86 \ link.exe失败,退出状态为1104

之所以无法打开“ python38.lib”,是因为在调试模式下的“ .lib”文件称为“ python38_d.lib”。

一个最小的可复制示例是(在命令行上)基于Quick Reference of the CPython developer guide

git clone --branch v3.8.0 https://github.com/python/cpython.git
cd cpython
git checkout v3.8.0
.\PCbuild\build.bat -e -d
.\PCbuild\win32\python_d.exe -m ensurepip
.\PCbuild\win32\python_d.exe -m pip install pip --upgrade -vv
.\PCbuild\win32\python_d.exe -m pip install setuptools --upgrade -vv
.\PCbuild\win32\python_d.exe -m pip install cython -vv

结果distutils.sysconfig.get_config_vars()为:

{'BINDIR': '...\\cpython\\PCbuild\\win32',
 'BINLIBDEST': ...\\cpython\\Lib',
 'EXE': '.exe',
 'EXT_SUFFIX': '_d.cp38-win32.pyd',
 'INCLUDEPY': '...\\cpython\\include;...\\cpython\\PC',
 'LIBDEST': '...\\cpython\\Lib',
 'SO': '_d.cp38-win32.pyd',
 'VERSION': '38',
 'exec_prefix': '...\\cpython',
 'prefix': '...\\cpython',
 'srcdir': '...\\cpython'}

我缺少什么吗?是否完全不支持在Windows上的Python调试版本上构建C-Extensions?如果支持:我该怎么办?

python pip setuptools cpython python-c-api
1个回答
1
投票
但是,to check via dumpbin /dependents resulting.pyd很容易依赖于pythonXY.dll,在扩展名定义中加上extra_link_args = ["/VERBOSE:LIB"]并触发链接器的详细模式将表明该链接器使用了pythonXY.lib

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

in Python-headers

如您所见,要链接到调试版本,需要定义# 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由Windows上的_DEBUG自动定义,如果使用选项distutils调用build_ext,例如

--debug

可以是python setup.py build_ext -i --debug

translated to pip

可以粗略地解释为:在安装之前,使用选项pip触发pip install --global-option build --global-option --debug XXXXX 命令(还包括build-命令)。

构建调试C扩展时的另一种功能,有build_ext


--debug

具有已定义的more to it on Windows宏意味着不可分割的ABI #ifdef _DEBUG # define Py_DEBUG #endif ,因为它还假定了Py_DEBUG会导致until Python3.8的不同内存布局,以及释放模式中缺少一些其他功能。

但是,从Python3.8开始,可以通过提供缺少的Py_TRACE_REFS / Py_TRACE_REFS作为链接到另一个版本的符号链接来摆脱它。
© www.soinside.com 2019 - 2024. All rights reserved.