【发布时间】:2019-12-01 15:01:39
【问题描述】:
如果我在 Windows 上从源代码构建 CPython,当我想 pip 安装包含 C 扩展的包时会遇到问题。链接库时似乎发生了错误。
例如在安装 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 扩展?如果支持:我会怎么做?
【问题讨论】:
-
Distutils 从配置中获取信息。不确定您的设置如何。这是一个示例如何推翻设置文件中的设置stackoverflow.com/a/57057959/5769463
-
@ead 您是指 CPython 配置还是我尝试安装的扩展模块中的配置?也不应该默认选择 CPython 构建选项(并且我想安装的模块之一在设置中基本上不包含自定义) - 那么为什么它没有意识到它必须链接到
python38_d.lib?我在我的计算机和 CI 上测试了问题中的命令,但它们都失败了。如果您有解决方法或建议如何解决此问题,我将不胜感激:) -
我的意思是 distutils.config。您可以检查提供的值并查看问题所在。遗憾的是,接下来的几天我将无法调查这个问题
-
@ead 感谢您的澄清。我在问题中包含了值。
标签: python pip setuptools cpython python-c-api