简体   繁体   中英

Building Python extension fails ("kernel32.lib" cannot be opened | "x64" conflicts with target machine type "x86")

I am trying to install the python extension line-profiler via pip on a fresh installation of Anaconda3. As the package requires a compiler, I have installed the Visual Studio Build Tools 2019 along with the Windows 10 SDK. In particular, I have installed

  • 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)

I am working on 64bit Windows 10, build 18363.1082.

To make sure that all compiler files needed are found, I have added the following entries to the PATH environment variable:

  • C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\um\\x64
  • C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.18362.0\\x64
  • C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.27.29110\\bin\\Hostx64\\x64

Now when I run

pip install line-profiler

I get the error message

fatal error LNK1104: file "kernel32.lib" cannot be opened

even though the file kernel32.lib is clearly present in one of the folders added to PATH above. (Full error log at the end of this question)

After some research, I have found that operating in the Developer Command Prompt for VS 2019 can help resolve this issue, as it loads some batch files on startup. I have thus opend this command prompt, activated my Anaconda environment and run the same command again. Now I get the error

fatal error LNK1112: machine type "x64" is in confilict with the target machine type "x86".

How can I set up VS to compile extensions properly? In particular, I wonder

  1. How can I set up the anaconda prompt (or any other prompt) so that the correct kernel32.lib is always found?
  2. How can I facilitate that the x64 version of the extension is created (clearly I am working on x64)

The full error messages are below (freely translated from German where necessary)

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\10\bin\100183~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100183~1.0\x64\mt.exe --manifests  -- C:\PROGRA~2\MICROS~3\2019\BUILDT~1\VC\Tools\MSVC\1427~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~3\2019\BUILDT~1\VC\Tools\MSVC\1427~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\10\bin\100183~1.0\x86\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100183~1.0\x86\mt.exe --manifests  -- C:\PROGRA~2\MICROS~3\2019\BUILDT~1\VC\Tools\MSVC\1427~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~3\2019\BUILDT~1\VC\Tools\MSVC\1427~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.

The issue is that not all environment variables are set properly. To do this, the file C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Auxiliary\\Build\\vcvars64.bat can / needs to be executed. This is (almost) done on the startup of Develper Command Prompt, which explains why the kernel32.lib is found if working within this console.

The second error occurs, because the Develper Command Prompt does not execute the x64 version of the script and thus sets variables to the paths of the x86 compilers. Using the "x64 Native Tools Command Prompt for VS 2019" (can be found in the start menu) solves the issue.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM