本文主要介绍python windows编译过程中可能遇到的一些代表性问题,并将在今后开发过程中不断更新和补充。这里主要针对Windows系统,而且通常也是Windows系统出现问题的情况居多。运气好的时候,编译能一次就过;但往往还是会有一些异常情况。
python编译主要应用在以下场景:
(1)python库安装。
(2)py文件转pyd。
(3)……
这里以py转pyd为例。
python setup.py build_ext
可以快速搜索电脑中的问题,基本一秒之内就可以找到。官方下载链接为:voidtools
由于编译工具经常需要依赖C++,所以需要下载Microsoft Visual Studio环境,并且在Visual Studio Installer界面,选择“使用C++的桌面开发”,确保安装了至少一个版本的Windows 10 SDK,如下图所示。
pyconfig.h(59): fatal error C1083: 无法打开包括文件: “io.h”: No such file or directory
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\cl.exe' failed with exit code 2
这是因为系统无法找到io.h文件,这个文件一般位于 C:\Program Files (x86)\Windows Kits\10\Include\SDK版本\ucrt文件夹下。如果没有对应的SDK版本文件夹,那么回到1.2节采用isual Studio Installer安装Windows 10 SDK。
对于出现xxx.h无法找到的情况,我们需要创建或更新INCLUDE环境变量,增加xxx.h所在文件夹路径。例如,针对本节问题,在环境变量中创建INCLUDE(如果已存在,则无需创建),新增路径“C:\Program Files (x86)\Windows Kits\10\Include\SDK版本\ucrt”。环境变量多个值之间,用英文分号“;”隔开。
修改完成之后,重新启动编译窗口,再次编译。如果仍然出现错误,可继续查看出现接下来章节所述错误。
pyconfig.h(203): fatal error C1083: 无法打开包括文件: “basetsd.h”: No such file or directory
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\cl.exe' failed with exit code 2
对于出现xxx.h无法找到的情况,我们需要创建或更新INCLUDE环境变量,增加xxx.h所在文件夹路径。我们用1.1节中Everything工具搜索basetsd.h,发现其存在于文件夹“C:\Program Files (x86)\Windows Kits\10\Include\SDK版本\shared”。如果没有对应的SDK版本文件夹,那么回到1.2节采用isual Studio Installer安装Windows 10 SDK。
对于出现xxx.h无法找到的情况,我们需要创建或更新INCLUDE环境变量,增加xxx.h所在文件夹路径。例如,针对本节问题,在环境变量中创建INCLUDE(如果已存在,则无需创建),新增路径“C:\Program Files (x86)\Windows Kits\10\Include\SDK版本\shared”。环境变量多个值之间,用英文分号“;”隔开。
修改完成之后,重新启动编译窗口,再次编译。如果仍然出现错误,可继续查看出现接下来章节所述错误。
LINK : fatal error LNK1104: 无法打开文件“kernel32.lib”
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe' failed with exit code 1104
出现该错误,表示编译环境没有找到“kernel32.lib”。 对于出现xxx.lib无法找到的情况,我们需要创建或更新LIB环境变量,增加xxx.lib所在文件夹路径。我们用1.1节中Everything工具搜索kernel32.lib,发现其存在于文件夹“C:\Program Files (x86)\Windows Kits\10\Lib\SDK版本\um\x64”,也可以是x64、x86、arm、arm64,根据需要进行选择。如果没有对应的SDK版本文件夹,那么回到1.2节采用isual Studio Installer安装Windows 10 SDK。
修改完成之后,重新启动编译窗口,再次编译。如果仍然出现错误,可继续查看出现接下来章节所述错误。
LINK : fatal error LNK1104: 无法打开文件“ucrt.lib”
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe' failed with exit code 1104
出现该错误,表示编译环境没有找到“ucrt.lib”。 对于出现xxx.lib无法找到的情况,我们需要创建或更新LIB环境变量,增加xxx.lib所在文件夹路径。我们用1.1节中Everything工具搜索ucrt.lib,发现其存在于文件夹“C:\Program Files (x86)\Windows Kits\10\Lib\SDK版本\ucrt\x64”,也可以是x64、x86、arm、arm64,根据需要进行选择。如果没有对应的SDK版本文件夹,那么回到1.2节采用isual Studio Installer安装Windows 10 SDK。
修改完成之后,重新启动编译窗口,再次编译。如果仍然出现错误,可继续查看出现接下来章节所述错误。
LINK : fatal error LNK1158: 无法运行“rc.exe”
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe' failed with exit code 1158
出现该错误,表示编译环境没有找到“rc.exe”。 对于出现xxx.exe无法找到的情况,我们需要更新Path环境变量,增加xxx.exe所在文件夹路径。我们用1.1节中Everything工具搜索rc.exe,发现其存在于文件夹“C:\Program Files (x86)\Windows Kits\10\bin\SDK版本\x64”,也可以是x64、x86、arm、arm64,根据需要进行选择。如果没有对应的SDK版本文件夹,那么回到1.2节采用isual Studio Installer安装Windows 10 SDK。
修改完成之后,重新启动编译窗口,再次编译。如果仍然出现错误,可继续查看出现接下来章节所述错误。
修改环境后重新编译时,切记要重启编译窗口,例如cmd或C++编译窗口。否则,编译会一直提示修改之前的错误。
环境变量多个值之间,用英文分号“;”隔开。