如果我从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?如果支持:我该怎么办?
dumpbin /dependents resulting.pyd
很容易依赖于pythonXY.dll
,在扩展名定义中加上extra_link_args = ["/VERBOSE:LIB"]
并触发链接器的详细模式将表明该链接器使用了pythonXY.lib
。偷偷摸摸的部分:Microsoft Compler具有便利的编译指示#pragma comment(lib, ...)
,可以自动触发库的链接,也可以使用#pragma comment(lib, ...)
:
如您所见,要链接到调试版本,需要定义# 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
作为链接到另一个版本的符号链接来摆脱它。