Windows下,正常启动VS那么它是这样搜索的:

通过 VC++目录下的可执行目录、包含目录、库文件目录、引用文件目录、源文件目录和排除目录找出所需目录,其中可执行目录指向包含可执行文件的目录,通常是名字叫bin的文件夹,存放了.exe、.dll文件,对应这环境变量中的PATH;

包含文件对应了系统环境的INCLUDE变量,文件夹下通常包含的都是一些头文件.h或者.c、.cpp文件;

 

引用文件目录则对应LIBPATH目录,通常指向使用#Using指令在代码中引用的程序集和模块(没用过,文件夹下包含了什么就不是很明白了,高手请指教);

库文件目录对应LIB环境变量,其文件夹下通常包含的是.lib这样的静态库;

排除目录是指再依赖文件目录下的一些文件可能混淆真正必须的文件,那么我们就需要使用这个目录来剔除不需要的文件避免出错;

在系统环境变量中没有PATH、LIB LIBPATH INCLUDE的条件下,那么Visual Studio将自动转至系统环境变量path逐一搜索该变量中所包含的目录,以上就是VS在没有任何辅助工具的条件下会进行的一系列的搜索目录处理。

在使用一些开源的库的时候通常这些库都需要在本机上进行配置因此我们会用到像Cmake这样的跨平台配置软件。Cmake会与编译器合作将环境配置好,主要是在编译程序时需要的各种依赖条件。关于Cmake配置路径的方式我有一个大致的概念了,Cmake是通过系统的环境变量寻找对应的库文件先从System32下面找,依次向后搜索各个目录直至找到了对应的文件,但它只匹配文件的名字,并不匹配文件对应的版本信息,所以包含的目录下有俩同名文件那就先找到的先进入配置序列。生成了CmakeCach.txt文件,在之后的编译过程将会因为版本之间的差别而产生各式各样的莫名其妙的错误,如果在你编译这一类的程序是出现莫名的错误请查看项目(project)-》##项目属性(property)-》配置属性(configuration property)-》连接器(Linker)-》输出(input)-》Additional Dependency,以及C/C++-》常规(General)中的依赖项目录。

简单的经验就这些,一下我将对我在这一过程中遇到的错误贴出来和大家共同探讨。

///2012-2-25更新
关于#include" "和 #include<>
若是用双引号表明程序是引用非标准库的头文件,编译器从用户的工作目录(用户的源文件的存储目录如图所示) 开始搜索。
这里OpenCVTutor这个文件夹就是当前的用户工作目录.
 若是用尖括号连接器只会搜索在directory中指定了的include 目录以及环境变量中的path.它意味着程序在引用标准库头文件,编译器从标准库目录开始搜索。
 ///2013-9-24更新
如果VS工程无法正常打开,例如需要进行项目版本的转换时无论是高版本向低版本转换还是相反的转换都面临着路径的转换,在工程文件中设有路径的宏定义由于版本都更迭就可能导致最终路径定位错误。在这一过程中一般有的错误有error C1083,error LNK2001,error LNK2019等。有幸在这几天之内都碰到了,

strmbasd.lib(wxutil.obj) : error LNK2019: 无法解析的外部符号 ___CxxFrameHandler3,该符号在函数 __ehhandler$??0CAMThread@@QAE@XZ 中被引用
strmbasd.lib(wxlist.obj) : error LNK2001: 无法解析的外部符号 ___CxxFrameHandler3
wavdest.obj : error LNK2001: 无法解析的外部符号 ___CxxFrameHandler3
strmbasd.lib(transfrm.obj) : error LNK2001: 无法解析的外部符号 ___CxxFrameHandler3
strmbasd.lib(wxdebug.obj) : error LNK2001: 无法解析的外部符号 ___CxxFrameHandler3
strmbasd.lib(amfilter.obj) : error LNK2001: 无法解析的外部符号 ___CxxFrameHandler3
wavdest.obj : error LNK2019: 无法解析的外部符号 __alloca_probe_16,该符号在函数 "public: virtual long __thiscall CWavDestFilter::StopStreaming(void)" (?StopStreaming@CWavDestFilter@@UAEJXZ) 中被引用
strmbasd.lib(amvideo.obj) : error LNK2001: 无法解析的外部符号 __RTC_CheckEsp
strmbasd.lib(wxlist.obj) : error LNK2001: 无法解析的外部符号 __RTC_CheckEsp
strmbasd.lib(mtype.obj) : error LNK2019: 无法解析的外部符号 __RTC_CheckEsp,该符号在函数 "public: __thiscall FOURCCMap::FOURCCMap(unsigned long)" (??0FOURCCMap@@QAE@K@Z) 中被引用
strmbasd.lib(wxutil.obj) : error LNK2001: 无法解析的外部符号 __RTC_CheckEsp
strmbasd.lib(dllsetup.obj) : error LNK2001: 无法解析的外部符号 __RTC_CheckEsp
strmbasd.lib(dllentry.obj) : error LNK2001: 无法解析的外部符号 __RTC_CheckEsp
strmbasd.lib(transfrm.obj) : error LNK2001: 无法解析的外部符号 __RTC_CheckEsp
strmbasd.lib(wxdebug.obj) : error LNK2001: 无法解析的外部符号 __RTC_CheckEsp
strmbasd.lib(amfilter.obj) : error LNK2001: 无法解析的外部符号 __RTC_CheckEsp
strmbasd.lib(combase.obj) : error LNK2001: 无法解析的外部符号 __RTC_CheckEsp
strmbasd.lib(amvideo.obj) : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
strmbasd.lib(wxlist.obj) : error LNK2019: 无法解析的外部符号 __RTC_Shutdown,该符号在函数 "protected: struct __POSITION * __thiscall CBaseList::AddTailI(void *)" (?AddTailI@CBaseList@@IAEPAU__POSITION@@PAX@Z) 中被引用
strmbasd.lib(mtype.obj) : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
strmbasd.lib(wxutil.obj) : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
strmbasd.lib(dllsetup.obj) : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
strmbasd.lib(dllentry.obj) : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
strmbasd.lib(transfrm.obj) : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
strmbasd.lib(wxdebug.obj) : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
strmbasd.lib(amfilter.obj) : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
strmbasd.lib(combase.obj) : error LNK2001: 无法解析的外部符号 __RTC_Shutdown
strmbasd.lib(amvideo.obj) : error LNK2019: 无法解析的外部符号 __RTC_InitBase,该符号在函数 "public: __thiscall FOURCCMap::FOURCCMap(unsigned long)" (??0FOURCCMap@@QAE@K@Z) 中被引用
strmbasd.lib(wxlist.obj) : error LNK2001: 无法解析的外部符号 __RTC_InitBase
strmbasd.lib(mtype.obj) : error LNK2001: 无法解析的外部符号 __RTC_InitBase
strmbasd.lib(wxutil.obj) : error LNK2001: 无法解析的外部符号 __RTC_InitBase
strmbasd.lib(dllsetup.obj) : error LNK2001: 无法解析的外部符号 __RTC_InitBase
strmbasd.lib(dllentry.obj) : error LNK2001: 无法解析的外部符号 __RTC_InitBase
strmbasd.lib(transfrm.obj) : error LNK2001: 无法解析的外部符号 __RTC_InitBase
strmbasd.lib(wxdebug.obj) : error LNK2001: 无法解析的外部符号 __RTC_InitBase
strmbasd.lib(amfilter.obj) : error LNK2001: 无法解析的外部符号 __RTC_InitBase
strmbasd.lib(combase.obj) : error LNK2001: 无法解析的外部符号 __RTC_InitBase
strmbasd.lib(wxlist.obj) : error LNK2001: 无法解析的外部符号 @_RTC_CheckStackVars@8
strmbasd.lib(wxutil.obj) : error LNK2001: 无法解析的外部符号 @_RTC_CheckStackVars@8
strmbasd.lib(dllsetup.obj) : error LNK2001: 无法解析的外部符号 @_RTC_CheckStackVars@8
strmbasd.lib(dllentry.obj) : error LNK2001: 无法解析的外部符号 @_RTC_CheckStackVars@8
strmbasd.lib(amvideo.obj) : error LNK2001: 无法解析的外部符号 @_RTC_CheckStackVars@8
strmbasd.lib(transfrm.obj) : error LNK2019: 无法解析的外部符号 @_RTC_CheckStackVars@8,该符号在函数 "public: virtual class CBasePin * __thiscall CTransformFilter::GetPin(int)" (?GetPin@CTransformFilter@@UAEPAVCBasePin@@H@Z) 中被引用
strmbasd.lib(wxdebug.obj) : error LNK2001: 无法解析的外部符号 @_RTC_CheckStackVars@8
strmbasd.lib(amfilter.obj) : error LNK2001: 无法解析的外部符号 @_RTC_CheckStackVars@8
strmbasd.lib(combase.obj) : error LNK2001: 无法解析的外部符号 @_RTC_CheckStackVars@8
strmbasd.lib(wxutil.obj) : error LNK2019: 无法解析的外部符号 __RTC_UninitUse,该符号在函
1>  GMpDbLayerSQLITE.cpp
 1>e:\polaris\map++ database\mpdatabase\includestd.h(9): fatal error C1083: Cannot open include file: 'filesystem': No such file or directory
 1>  GMpDbTileBLOB.cpp
 1>e:\polaris\map++ database\mpdatabase\includestd.h(9): fatal error C1083: Cannot open include file: 'filesystem': No such file or directory
 1>  GMpDatabaseSQLITE.cpp
 1>e:\polaris\map++ database\mpdatabase\includestd.h(9): fatal error C1083: Cannot open include file: 'filesystem': No such file or directory
 1>  Generating Code...
 1>


1>Build FAILED.

更为离谱的是有些时候连标准库都无法识别报错LNK2019,遇到这些问题首要检查标准路径设置是否正确,在VS2008之前可以在工具菜单栏下都对话框中设置,VS2010及以后要在工程属性都C++目录中去设置。相对路径不好用就改为绝对路径。