21168

“vcvarsall.bat” issue while building SWIG on Windows

Question:

Following instructions from: <a href="http://www.smileofthales.com/build-quantlib-for-python/" rel="nofollow">Build QuantLib for Python(SWIG)</a>

python setup.py build --compiler=msvc

I wonder why vcvarsall.bat cannot be found. Actually, this batch file is found at:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC

Furthermore, I've copied it to:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools

and have finally added the latter path to the System variables -> PATH, without any improvement.

<strong><em>Ps:</em></strong> A similar topic has been raised on <a href="https://stackoverflow.com/questions/28251314/error-microsoft-visual-c-10-0-is-required-unable-to-find-vcvarsall-bat" rel="nofollow">error-microsoft-visual-c-10-0-is-required-unable-to-find-vcvarsall-bat(DUPLICATE)</a>, but none of the solutions advocated have so far helped me in overcoming this matter.

Any relevant feedback would therefore be appreciated.

<strong>OS:</strong> Windows 10

<strong>Studio:</strong> Express 2013 for Windows Desktop

<strong>Boost:</strong> v.1_58_0

<strong>SWIG:</strong> v.1_6

<strong>QuantLib:</strong> v.1_6

<strong>IDE:</strong> PTVS v.2.2.2

Thanks in advance

<strong>1 - EDIT:</strong> See below the screenshot (incl. error)

<a href="https://i.stack.imgur.com/REuRf.png" rel="nofollow"><img alt="enter image description here" class="b-lazy" data-src="https://i.stack.imgur.com/REuRf.png" data-original="https://i.stack.imgur.com/REuRf.png" src="https://etrip.eimg.top/images/2019/05/07/timg.gif" /></a>

<strong>Alternatively:</strong>

======================================================================= C:\local\QuantLib_SWIG_1_6\Python>python setup.py build --compiler=msvc running build running build_py running build_ext building 'QuantLib._QuantLib' extension error: Unable to find vcvarsall.bat ========================================================================

<strong>2 - EDIT:</strong>

I've even gone further by updating the get_build_version() method from the module: msvc9compiler.py held in

C:\Users\user\Miniconda3\Lib\distutils To:

#if majorVersion >= 13: updated if majorVersion > 13: # v13 was skipped and should be v14 majorVersion += 1 elif majorVersion == 13: #v13 no more skipped, UPDATED on 11/13/2016 majorVersion -= 1 # pointing specifically to v.12

since my Python 3.5.2 was compiled under MSC 1900 <=> VS 2015. However it's look like the compiler cannot be found as console (cmd) still returns

error:Unable to find vcvarsall.bat

<em>Ps</em>: Totally amazed with this installation. Solution of last resort: Install VS2015 Community that I was postponing

<strong>3 - EDIT:</strong>

set MSSdk=1 set DISTUTILS_USE_SDK=1 python setup.py build Error: The program can't start because mspdb120.dll is missing from your computer. Try reinstalling the program to fix this problem error: command 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64\cl.exe Failed with exit status - 10737441515

<em>Solution:</em>

Copy mspdb120.dll To C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64

python setup.py build quantlib_wrap.cpp QuantLib/quantlib_wrap.cpp: fatal error C1902: Program database manager mismatch; please check your installation error: command 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64\cl.exe Failed with exit status 2

Answer1:

vcvarsall.bat is needed only when running Visual C/C++ compiler from outside Visual Studio. It defines all the environment variables needed by Visual C/C++ compiler. This batch file should not be moved to other directories as installed by default as this results in setting up the environment variables wrong.

If this batch file needs to be called from another process without using full path, the directory containing vcvarsall.bat must be defined either in <strong>user</strong> or <strong>system</strong> PATH in Windows advanced environment settings or the directory path is added to <strong>local</strong> PATH of the process which calls later this batch file.

Every time a process is started, Windows creates a <strong>copy</strong> of the environment variables table of current process for the new process. This means a modification of environment variable PATH within a batch file is only active for the command process executing the batch file and all processes started by this command process after modification of <strong>local</strong> PATH. Other processes already running on modifying PATH within a command process continue running with their unmodified <strong>local</strong> copy of PATH.

So if <strong>user</strong> or <strong>system</strong> PATH is modified in advanced system settings of Windows. This modification becomes active for all already running processes only after a complete restart of Windows. The modification of <strong>user</strong> or <strong>system</strong> PATH without a restart of Windows becomes only active for processes started from Windows desktop <strong>after</strong> the modification as for those new processes the current environment variables table of Windows desktop is taken as source on creating the copy of the environment variables for the new process.

I suppose you have <strong>appended</strong> to <strong>system</strong> PATH the string

;%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\VC

whereby the semicolon at beginning is needed only if existing PATH before modification does not already end with a semicolon.

And after this modification of <strong>system</strong> PATH it is best to restart Windows to make it active for all processes.

By the way: I would not append this path to <strong>system</strong> PATH as system processes don't need that directory in PATH. I would append it to <strong>user</strong> PATH or create <strong>user</strong> PATH with the directory path if there is currently no PATH in user environment table. And most often it is enough to append a specific directory path to <strong>local</strong> PATH like here because this directory path is definitely not needed for all processes start as user process.

Answer2:

This is probably due to the Python distutils package looking for another version of Visual Studio. As far as I know, Python 2.7 to 3.2 was built with VC++9; versions 3.3 and 3.4 were built with VC++10; and versions of Python from 3.5 onwards are built with VC++14. When running distutils, each of them will look for the corresponding VC++ version unless you specify otherwise. Thus, Python (by the way, which version are you using?) doesn't find your vcvarsall.bat from VC++12 because it doesn't look into that path.

According to <a href="https://docs.python.org/2/distutils/apiref.html#module-distutils.msvccompiler" rel="nofollow">the Python docs</a>, the workaround would be to set the environment variables DISTUTILS_USE_SDK and MSSdk to tell distutils that the environment is already set up and that it doesn't need to look for vsvarsall.bat. After that, running the script from the command prompt for Visual Studio might work.

This said, it might not be guaranteed that a module compiled with a version of VC++ will work with a Python compiled with a different one, so you might want to install and use the one corresponding to your Python installation.

Recommend