相关疑难解决方法(0)

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

如果我在 Windows 上从源代码构建 CPython,当我想要 pip 安装包含 C 扩展的包时,我会遇到问题。链接库时似乎发生了错误。

例如,安装 cython 时(但在其他 C 扩展包上也会崩溃并出现相同的错误):

链接:致命错误 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”。

一个最小的可重现示例(在命令行上)基于CPython 开发人员指南的快速参考

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
Run Code Online (Sandbox Code Playgroud)

结果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': …
Run Code Online (Sandbox Code Playgroud)

python cpython pip setuptools python-c-api

4
推荐指数
1
解决办法
3764
查看次数

使用 cython --embed 时静态链接 python37.dll 和 vcruntime140.dll

假设我正在“cythonizing”这个test.py

import json
print(json.dumps({'key': 'hello world'}))
Run Code Online (Sandbox Code Playgroud)

和:

cython test.py --embed
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64
cl test.c /I C:\Python37\include /link C:\Python37\libs\python37.lib
Run Code Online (Sandbox Code Playgroud)

正如分发嵌入 Cython 编译的代码并使其在任何机器上工作所需的最小文件集中提到的,有必要沿着文件分发python37.dllvcruntime140.dll的内容Lib\(作为Lib\或打包到 a 中python37.ziptest.exe

问题:如何修改cl.exe ...命令来要求编译器静态链接python37.dll到文件vcruntime140.dll内部test.exe

(这样就不再需要运输python37.dll和单独)vcruntime140.dll

python dll cython visual-c++ cl

3
推荐指数
1
解决办法
1369
查看次数

标签 统计

python ×2

cl ×1

cpython ×1

cython ×1

dll ×1

pip ×1

python-c-api ×1

setuptools ×1

visual-c++ ×1