'What is the difference between the LIB and LIBPATH environment variables for MS Visual C/C++?

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.



Solution 1:[1]

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.

Solution 2:[2]

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 LIBPATHenvironment-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).

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2