Question: I've been working on some build scripts, and this is bugging me. I want to be sure that we're independent of environment settings, but in order to be sure of that I feel a need to understand how/where the settings are used by the tools.

The Visual Studio command prompt and/or vcvarsall.bat file set up two distinct environment variables: LIB and LIBPATH. The values are different, but partially overlapping. Here are the values from my system:

```
LIB=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\LIB;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\ATLMFC\LIB;C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86;

LIBPATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;C:\Windows\Microsoft.NET\Framework\v3.5;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\LIB;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\ATLMFC\LIB;C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral;\Microsoft.VCLibs\11.0\References\CommonConfiguration\neutral;

```

I'd just like to understand the rationale for having two different variables -- a little more than the obvious fact that LIBPATH brings in more libs. I've tried looking it up, but I haven't found a clear definition of when each is used by the linker and/or the dev environment.

Answer: 
`LIB` is for the linker, helps it find import and static libraries.

`LIBPATH` is for the compiler, helps it find metadata files. Like type libraries, .NET assemblies, WinRT .winmd files.
The `LIB` environment-variable is passed to the **linker**,
and helps it to find and import **`.lib`** files.

> 
> And that, no matter if `.lib` file belongs to dynamic or static library.
> 
> 
> 

The `LIBPATH`environment-variable is passed to the **compiler**,
and helps it to find **meta-data** files.

> 
> Like .NET assemblies, type libraries, or WinRT .winmd files.
> 
> 
> 

Also note that, the `/LIBPATH` command-line option has nothing to do with `LIBPATH` environment variable, and is just misleadingly named (by Microsoft).

> 
> And the path passed using said command-line option, is just searched before `LIB` environment-variable's paths, like it's prepending a path (which one should not simply call overriding).
> 
> 
>