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