使用python setup.py build_ext --inplace命令編譯cython代碼, 出現以下錯誤:
Compiling cython_example.pyx because it changed. [1/1] Cythonizing cython_example.pyx D:\python_virtualenv\bigdata\lib\site-packages\Cython\Compiler\Main.py:367: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: D:\學習\bigdatalearn\cython_test\cython_example.pyx tree = Parsing.p_module(s, pxd, full_module_name) running build_ext building 'cython_test.cython_example' extension creating build creating build\temp.win-amd64-3.6 creating build\temp.win-amd64-3.6\Release C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD "-Id:\program files\python361\include" "-Id:\program files\python361\includ e" "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" "-IC:\Program Files (x86)\Windows Kits \8.1\include\shared" "-IC:\Program Files (x86)\Windows Kits\8.1\include\um" "-IC:\Program Files (x86)\Windows Kits\8.1\include\winrt" /Tccython_example.c /Fobuild\temp.win-amd64 -3.6\Release\cython_example.obj cython_example.c creating D:\學習\bigdatalearn\cython_test\cython_test C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO "/LIBPATH:d:\program files\python361\ Libs" /LIBPATH:D:\python_virtualenv\bigdata\libs /LIBPATH:D:\python_virtualenv\bigdata\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64" /EXPORT:PyInit_cython_example b uild\temp.win-amd64-3.6\Release\cython_example.obj /OUT:D:\學習\bigdatalearn\cython_test\cython_test\cython_example.cp36-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.6\Release\c ython_example.cp36-win_amd64.lib python36.lib(python36.dll) : fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86' error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\link.exe' failed with exit status 1112
解決:
報錯的意思是系統環境是64位windows系統,使用的C編譯工具卻是32位的。
windows系統中'x86'表示32位。
上面這個錯的主要問題是使用的link.exe是32位的,只要改成64位的link.exe就沒有問題了。
環境: windows64位, python 64位, python3.6.1
第一步:
找到windows的系統環境變量path:
將"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64;" 加在path最前面,這樣就可以優先使用64位的link.exe。
第二步:
新建一個Dos窗口, 執行 "echo %PATH%" ,使環境變量立即生效。(在前面建好的DOS窗口下執行沒有用)
第三步:
如果是在pycharm的Terminal中執行的 python setup.py build_ext --inplace命令,還需要先重啟pycharm,再在其中執行編譯命令才會有效。
DOS的話新建一個DOS窗口即可。
解決了上面這個問題,又出現了一個新問題:
running build_ext building 'cython_test.cython_example' extension C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD "-Id:\program files\python361\include" "-Id:\program files\python361\include" "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\8.1\include\shared" "-IC:\Program Files (x86)\Windows Kits\8.1\include\um" "-IC:\Program Files (x 86)\Windows Kits\8.1\include\winrt" /Tccython_example.c /Fobuild\temp.win-amd64-3.6\Release\cython_example.obj cython_example.c C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO "/LIBPATH:d:\program files\python361\Libs" /LIBPATH:D:\python_virtualenv\bigdata\li bs /LIBPATH:D:\python_virtualenv\bigdata\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64" "/LIBPATH:C:\Program F iles (x86)\Windows Kits\8.1\lib\winv6.3\um\x64" /EXPORT:PyInit_cython_example build\temp.win-amd64-3.6\Release\cython_example.obj /OUT:D:\學習\bigdatalearn\cython_test\cython_test\cython_example.cp36-win_amd64.pyd /IMPLIB:build\t emp.win-amd64-3.6\Release\cython_example.cp36-win_amd64.lib cython_example.obj : warning LNK4197: export 'PyInit_cython_example' specified multiple times; using first specification Creating library build\temp.win-amd64-3.6\Release\cython_example.cp36-win_amd64.lib and object build\temp.win-amd64-3.6\Release\cython_example.cp36-win_amd64.exp Generating code Finished generating code LINK : fatal error LNK1158: cannot run 'rc.exe' error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\amd64\\link.exe' failed with exit status 1158
解決:
錯誤的意思是缺少rc.exe文件,這個文件在C:\Program Files (x86)\Windows Kits\8.1\bin\x64下,只需要將該目錄下的 rc.exe 和 rcdll.dll拷貝一份粘貼到link.exe所在目錄C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64下即可。
如果是32位系統,則是將C:\Program Files (x86)\Windows Kits\8.1\bin\x86下的rc.exe和rcdll.dll粘貼到C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin下。