构建 Python 扩展失败("kernel32.lib" 无法打开 | "x64" 与目标机器类型冲突 "x86")
Building Python extension fails ("kernel32.lib" cannot be opened | "x64" conflicts with target machine type "x86")
我正在尝试通过 pip 在全新安装的 Anaconda3 上安装 python 扩展 line-profiler
。由于软件包需要编译器,我安装了 Visual Studio Build Tools 2019 以及 Windows 10 SDK。特别是,我安装了
- MSVC v142 – VS 2019 C++-x64/x86-Buildtools (v14.27)
- Windows 10 个 SDK (10.0.18362.0)
- MSVC v141 – VS 2017 C++-x64/x86-Buildtools (v14....)
- MSVC v140 – VS 2015 C++-Buildtools (v14.00)
我正在使用 64 位 Windows 10,构建 18363.1082。
为了确保找到所有需要的编译器文件,我在 PATH 环境变量中添加了以下条目:
- C:\Program Files (x86)\Windows Kits\Lib.0.18362.0\um\x64
- C:\Program Files (x86)\Windows Kits\bin.0.18362.0\x64
- C:\Program Files (x86)\Microsoft Visual Studio19\BuildTools\VC\Tools\MSVC.27.29110\bin\Hostx64\x64
现在当我运行
pip install line-profiler
我收到错误消息
fatal error LNK1104: file "kernel32.lib" cannot be opened
即使文件 kernel32.lib
清楚地存在于添加到上述 PATH 的文件夹之一中。 (此问题末尾的完整错误日志)
经过一些研究,我发现在 VS 2019 的开发人员命令提示符中操作可以帮助解决这个问题,因为它会在启动时加载一些批处理文件。因此,我打开了这个命令提示符,激活了我的 Anaconda 环境并再次 运行 相同的命令。现在我得到错误
fatal error LNK1112: machine type "x64" is in confilict with the target machine type "x86".
如何设置 VS 以正确编译扩展?特别是,我想知道
- 如何设置 anaconda 提示(或任何其他提示)以便始终找到正确的
kernel32.lib
?
- 我如何促进创建扩展的 x64 版本(显然我正在使用 x64)
完整的错误消息如下(必要时从德语自由翻译)
ERROR: Command errored out with exit status 1:
command: 'C:\Users\user\Anaconda3\python.exe' 'C:\Users\user\Anaconda3\lib\site-packages\pip\_vendor\pep517\_in_process.py' build_wheel 'C:\Users\user\AppData\Local\Temp\tmpvbz5hf82'
cwd: C:\Users\user\AppData\Local\Temp\pip-install-vluz_z60\line-profiler
Complete output (217 lines):
Not searching for unused variables given on the command line.
-- The C compiler identification is MSVC 19.27.29112.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe - broken
CMake Error at C:/Users/user/AppData/Local/Temp/pip-build-env-bxchh6aq/overlay/Lib/site-packages/cmake/data/share/cmake-3.18/Modules/CMakeTestCCompiler.cmake:66 (message):
The C compiler
"C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: C:/Users/user/AppData/Local/Temp/pip-install-vluz_z60/line-profiler/_cmake_test_compile/build/CMakeFiles/CMakeTmp
Run Build Command(s):C:/Users/user/AppData/Local/Temp/pip-build-env-bxchh6aq/overlay/Scripts/ninja.exe cmTC_9b999 && [1/2] Building C object CMakeFiles\cmTC_9b999.dir\testCCompiler.c.obj
[2/2] Linking C executable cmTC_9b999.exe
FAILED: cmTC_9b999.exe
cmd.exe /C "cd . && C:\Users\user\AppData\Local\Temp\pip-build-env-bxchh6aq\overlay\Lib\site-packages\cmake\data\bin\cmake.exe -E vs_link_exe --intdir=CMakeFiles\cmTC_9b999.dir --rc=C:\PROGRA~2\WI3CF2~1\bin0183~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\bin0183~1.0\x64\mt.exe --manifests -- C:\PROGRA~2\MICROS~319\BUILDT~1\VC\Tools\MSVC27~1.291\bin\Hostx64\x64\link.exe /nologo CMakeFiles\cmTC_9b999.dir\testCCompiler.c.obj /out:cmTC_9b999.exe /implib:cmTC_9b999.lib /pdb:cmTC_9b999.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK Pass 1: command "C:\PROGRA~2\MICROS~319\BUILDT~1\VC\Tools\MSVC27~1.291\bin\Hostx64\x64\link.exe /nologo CMakeFiles\cmTC_9b999.dir\testCCompiler.c.obj /out:cmTC_9b999.exe /implib:cmTC_9b999.lib /pdb:cmTC_9b999.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\cmTC_9b999.dir/intermediate.manifest CMakeFiles\cmTC_9b999.dir/manifest.res" failed (exit code 1104) with the following output:
LINK : fatal error LNK1104: Datei "kernel32.lib" kann nicht geöffnet werden.
ninja: build stopped: subcommand failed.
FAILED: line_profiler/_line_profiler.cp38-win_amd64.pyd
cmd.exe /C "cd . && C:\Users\user\AppData\Local\Temp\pip-build-env-mf957mv5\overlay\Lib\site-packages\cmake\data\bin\cmake.exe -E vs_link_dll --intdir=line_profiler\CMakeFiles\_line_profiler.dir --rc=C:\PROGRA~2\WI3CF2~1\bin0183~1.0\x86\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\bin0183~1.0\x86\mt.exe --manifests -- C:\PROGRA~2\MICROS~319\BUILDT~1\VC\Tools\MSVC27~1.291\bin\Hostx86\x86\link.exe /nologo line_profiler\CMakeFiles\_line_profiler.dir\_line_profiler.c.obj line_profiler\CMakeFiles\_line_profiler.dir\unset_trace.c.obj line_profiler\CMakeFiles\_line_profiler.dir\timers.c.obj /out:line_profiler\_line_profiler.cp38-win_amd64.pyd /implib:line_profiler\_line_profiler.lib /pdb:line_profiler\_line_profiler.pdb /dll /version:0.0 /machine:X86 /INCREMENTAL:NO /EXPORT:PyInit__line_profiler C:\Users\user\Anaconda3\libs\python38.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK: command "C:\PROGRA~2\MICROS~319\BUILDT~1\VC\Tools\MSVC27~1.291\bin\Hostx86\x86\link.exe /nologo line_profiler\CMakeFiles\_line_profiler.dir\_line_profiler.c.obj line_profiler\CMakeFiles\_line_profiler.dir\unset_trace.c.obj line_profiler\CMakeFiles\_line_profiler.dir\timers.c.obj /out:line_profiler\_line_profiler.cp38-win_amd64.pyd /implib:line_profiler\_line_profiler.lib /pdb:line_profiler\_line_profiler.pdb /dll /version:0.0 /machine:X86 /INCREMENTAL:NO /EXPORT:PyInit__line_profiler C:\Users\user\Anaconda3\libs\python38.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:line_profiler\_line_profiler.cp38-win_amd64.pyd.manifest" failed (exit code 1112) with the following output:
python38.lib(python38.dll) : fatal error LNK1112: Modul-Computertyp "x64" steht in Konflikt mit dem Zielcomputertyp "x86".
ninja: build stopped: subcommand failed.
问题是并非所有环境变量都设置正确。为此,可以/需要执行文件 C:\Program Files (x86)\Microsoft Visual Studio19\BuildTools\VC\Auxiliary\Build\vcvars64.bat
。这(几乎)是在 Develper 命令提示符启动时完成的,这解释了为什么如果在此控制台中工作,会发现 kernel32.lib。
出现第二个错误,因为 Develper 命令提示符不执行脚本的 x64 版本,因此将变量设置为 x86 编译器的路径。使用“VS 2019 的 x64 本机工具命令提示符”(可以在开始菜单中找到)解决了这个问题。
我正在尝试通过 pip 在全新安装的 Anaconda3 上安装 python 扩展 line-profiler
。由于软件包需要编译器,我安装了 Visual Studio Build Tools 2019 以及 Windows 10 SDK。特别是,我安装了
- MSVC v142 – VS 2019 C++-x64/x86-Buildtools (v14.27)
- Windows 10 个 SDK (10.0.18362.0)
- MSVC v141 – VS 2017 C++-x64/x86-Buildtools (v14....)
- MSVC v140 – VS 2015 C++-Buildtools (v14.00)
我正在使用 64 位 Windows 10,构建 18363.1082。
为了确保找到所有需要的编译器文件,我在 PATH 环境变量中添加了以下条目:
- C:\Program Files (x86)\Windows Kits\Lib.0.18362.0\um\x64
- C:\Program Files (x86)\Windows Kits\bin.0.18362.0\x64
- C:\Program Files (x86)\Microsoft Visual Studio19\BuildTools\VC\Tools\MSVC.27.29110\bin\Hostx64\x64
现在当我运行
pip install line-profiler
我收到错误消息
fatal error LNK1104: file "kernel32.lib" cannot be opened
即使文件 kernel32.lib
清楚地存在于添加到上述 PATH 的文件夹之一中。 (此问题末尾的完整错误日志)
经过一些研究,我发现在 VS 2019 的开发人员命令提示符中操作可以帮助解决这个问题,因为它会在启动时加载一些批处理文件。因此,我打开了这个命令提示符,激活了我的 Anaconda 环境并再次 运行 相同的命令。现在我得到错误
fatal error LNK1112: machine type "x64" is in confilict with the target machine type "x86".
如何设置 VS 以正确编译扩展?特别是,我想知道
- 如何设置 anaconda 提示(或任何其他提示)以便始终找到正确的
kernel32.lib
? - 我如何促进创建扩展的 x64 版本(显然我正在使用 x64)
完整的错误消息如下(必要时从德语自由翻译)
ERROR: Command errored out with exit status 1:
command: 'C:\Users\user\Anaconda3\python.exe' 'C:\Users\user\Anaconda3\lib\site-packages\pip\_vendor\pep517\_in_process.py' build_wheel 'C:\Users\user\AppData\Local\Temp\tmpvbz5hf82'
cwd: C:\Users\user\AppData\Local\Temp\pip-install-vluz_z60\line-profiler
Complete output (217 lines):
Not searching for unused variables given on the command line.
-- The C compiler identification is MSVC 19.27.29112.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe - broken
CMake Error at C:/Users/user/AppData/Local/Temp/pip-build-env-bxchh6aq/overlay/Lib/site-packages/cmake/data/share/cmake-3.18/Modules/CMakeTestCCompiler.cmake:66 (message):
The C compiler
"C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: C:/Users/user/AppData/Local/Temp/pip-install-vluz_z60/line-profiler/_cmake_test_compile/build/CMakeFiles/CMakeTmp
Run Build Command(s):C:/Users/user/AppData/Local/Temp/pip-build-env-bxchh6aq/overlay/Scripts/ninja.exe cmTC_9b999 && [1/2] Building C object CMakeFiles\cmTC_9b999.dir\testCCompiler.c.obj
[2/2] Linking C executable cmTC_9b999.exe
FAILED: cmTC_9b999.exe
cmd.exe /C "cd . && C:\Users\user\AppData\Local\Temp\pip-build-env-bxchh6aq\overlay\Lib\site-packages\cmake\data\bin\cmake.exe -E vs_link_exe --intdir=CMakeFiles\cmTC_9b999.dir --rc=C:\PROGRA~2\WI3CF2~1\bin0183~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\bin0183~1.0\x64\mt.exe --manifests -- C:\PROGRA~2\MICROS~319\BUILDT~1\VC\Tools\MSVC27~1.291\bin\Hostx64\x64\link.exe /nologo CMakeFiles\cmTC_9b999.dir\testCCompiler.c.obj /out:cmTC_9b999.exe /implib:cmTC_9b999.lib /pdb:cmTC_9b999.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK Pass 1: command "C:\PROGRA~2\MICROS~319\BUILDT~1\VC\Tools\MSVC27~1.291\bin\Hostx64\x64\link.exe /nologo CMakeFiles\cmTC_9b999.dir\testCCompiler.c.obj /out:cmTC_9b999.exe /implib:cmTC_9b999.lib /pdb:cmTC_9b999.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\cmTC_9b999.dir/intermediate.manifest CMakeFiles\cmTC_9b999.dir/manifest.res" failed (exit code 1104) with the following output:
LINK : fatal error LNK1104: Datei "kernel32.lib" kann nicht geöffnet werden.
ninja: build stopped: subcommand failed.
FAILED: line_profiler/_line_profiler.cp38-win_amd64.pyd
cmd.exe /C "cd . && C:\Users\user\AppData\Local\Temp\pip-build-env-mf957mv5\overlay\Lib\site-packages\cmake\data\bin\cmake.exe -E vs_link_dll --intdir=line_profiler\CMakeFiles\_line_profiler.dir --rc=C:\PROGRA~2\WI3CF2~1\bin0183~1.0\x86\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\bin0183~1.0\x86\mt.exe --manifests -- C:\PROGRA~2\MICROS~319\BUILDT~1\VC\Tools\MSVC27~1.291\bin\Hostx86\x86\link.exe /nologo line_profiler\CMakeFiles\_line_profiler.dir\_line_profiler.c.obj line_profiler\CMakeFiles\_line_profiler.dir\unset_trace.c.obj line_profiler\CMakeFiles\_line_profiler.dir\timers.c.obj /out:line_profiler\_line_profiler.cp38-win_amd64.pyd /implib:line_profiler\_line_profiler.lib /pdb:line_profiler\_line_profiler.pdb /dll /version:0.0 /machine:X86 /INCREMENTAL:NO /EXPORT:PyInit__line_profiler C:\Users\user\Anaconda3\libs\python38.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK: command "C:\PROGRA~2\MICROS~319\BUILDT~1\VC\Tools\MSVC27~1.291\bin\Hostx86\x86\link.exe /nologo line_profiler\CMakeFiles\_line_profiler.dir\_line_profiler.c.obj line_profiler\CMakeFiles\_line_profiler.dir\unset_trace.c.obj line_profiler\CMakeFiles\_line_profiler.dir\timers.c.obj /out:line_profiler\_line_profiler.cp38-win_amd64.pyd /implib:line_profiler\_line_profiler.lib /pdb:line_profiler\_line_profiler.pdb /dll /version:0.0 /machine:X86 /INCREMENTAL:NO /EXPORT:PyInit__line_profiler C:\Users\user\Anaconda3\libs\python38.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:line_profiler\_line_profiler.cp38-win_amd64.pyd.manifest" failed (exit code 1112) with the following output:
python38.lib(python38.dll) : fatal error LNK1112: Modul-Computertyp "x64" steht in Konflikt mit dem Zielcomputertyp "x86".
ninja: build stopped: subcommand failed.
问题是并非所有环境变量都设置正确。为此,可以/需要执行文件 C:\Program Files (x86)\Microsoft Visual Studio19\BuildTools\VC\Auxiliary\Build\vcvars64.bat
。这(几乎)是在 Develper 命令提示符启动时完成的,这解释了为什么如果在此控制台中工作,会发现 kernel32.lib。
出现第二个错误,因为 Develper 命令提示符不执行脚本的 x64 版本,因此将变量设置为 x86 编译器的路径。使用“VS 2019 的 x64 本机工具命令提示符”(可以在开始菜单中找到)解决了这个问题。