zl程序教程

您现在的位置是:首页 >  后端

当前栏目

python windows编译问题总结

PythonWindows 总结 编译 问题
2023-09-27 14:27:52 时间

        本文主要介绍python windows编译过程中可能遇到的一些代表性问题,并将在今后开发过程中不断更新和补充。这里主要针对Windows系统,而且通常也是Windows系统出现问题的情况居多。运气好的时候,编译能一次就过;但往往还是会有一些异常情况。

        python编译主要应用在以下场景:

        (1)python库安装。

        (2)py文件转pyd。

        (3)……

        这里以py转pyd为例。

python setup.py build_ext

1 辅助工具

        1.1 Everything

        可以快速搜索电脑中的问题,基本一秒之内就可以找到。官方下载链接为:voidtools

       

        1.2 Microsoft Visual Studio

        由于编译工具经常需要依赖C++,所以需要下载Microsoft Visual Studio环境,并且在Visual Studio Installer界面,选择“使用C++的桌面开发”,确保安装了至少一个版本的Windows 10 SDK,如下图所示。

2 常见错误

2.1 pyconfig.h(59): fatal error C1083: 无法打开包括文件: “io.h”: No such file or directory

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”。环境变量多个值之间,用英文分号“;”隔开。

        修改完成之后,重新启动编译窗口,再次编译。如果仍然出现错误,可继续查看出现接下来章节所述错误。

2.2 pyconfig.h(203): fatal error C1083: 无法打开包括文件: “basetsd.h”: No such file or directory

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”。环境变量多个值之间,用英文分号“;”隔开。

        修改完成之后,重新启动编译窗口,再次编译。如果仍然出现错误,可继续查看出现接下来章节所述错误。

2.3 LINK : fatal error LNK1104: 无法打开文件“kernel32.lib”

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。

         修改完成之后,重新启动编译窗口,再次编译。如果仍然出现错误,可继续查看出现接下来章节所述错误。

2.4 LINK : fatal error LNK1104: 无法打开文件“ucrt.lib”

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。

 

        修改完成之后,重新启动编译窗口,再次编译。如果仍然出现错误,可继续查看出现接下来章节所述错误。

2.5 LINK : fatal error LNK1158: 无法运行“rc.exe”

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。

         修改完成之后,重新启动编译窗口,再次编译。如果仍然出现错误,可继续查看出现接下来章节所述错误。

3 注意事项

        修改环境后重新编译时,切记要重启编译窗口,例如cmd或C++编译窗口。否则,编译会一直提示修改之前的错误。

        环境变量多个值之间,用英文分号“;”隔开。