1 前言:
对vs的包含头文件的组织,你困惑吗?
- VC++ Directories -> Include Directories 适用于当前项目。
- C/C++ -> General -> Additional Include Directories。 适用于所有项目,修改了系统include变量。
为啥呢?一般为不知道?
有的说:
VC++目录:
代表的是全局项目的包含目录
我困惑的抖起来,这已经矛盾了啊。。。
再看,有的说:
VC++目录:
包含目录:寻找#include<xxxx.h>中的xxxx.h的搜索目录
C/C++:
常规->附加包含目录:寻找#include<xxxx.h>中的xxxx.h的搜索目录(每一项对应一个文件夹XXXX,文件夹中包含了编译时所需的头文件,使用时直接#include即可)
我几乎现在要喊:BullSHI----
结论:
老规矩,先写结论方便看完就闪人:
- 本地项目,自己的项目用的库文件:用C/C++选项来设定
- 系统环境变量里面已经定义的库,已经安装的库,已经被其他项目用的库,例如,一些开源库,用VC++的定义来设定
- 如果你在VC++下设定头文件,那么库的链接也最好放在这里
- 如果在C/C++设定了某个库的头文件,那么这个库的链接也放在这
2 VS头文件的包含路径的两种设置和概念的混淆:
- 设置方法1:项目/属性页/配置属性/VC++ 目录/包含目录
【官方解释:使用此VC++ 目录属性页可告知Visual Studio生成当前【案,这个当前是针对Vs的解决方案来说的】所选项目时要使用的目录。VC++ 目录属性适用于项目,而不是顶级解决方案节点。 如果在“配置属性”下未看到“VC++ 目录”,请在“解决方案资源管理器”窗口中选择一个 C++ 项目节点:
“VC++ Directories -> Include Directories” : Directory settings displayed in the window are the directories that Visual Studio will search for include files referred to in your source code files. Corresponds to environment variable INCLUDE. More information】
具体可以参考链接VC++ 目录”属性页 (Windows)
- 设置方法2:项目/属性页/配置属性/C/C++
【官方解释,“C/C++ -> General -> Additional Include Directories”: The directory to be added to the list of directories searched for include files.感觉这个英式中文写的晦涩难懂】
具体可以参考链接[C/C++]
主要的内容,贴在下面:
备注
若要添加多个目录,请使用此选项多次。 仅在找到指定的包含文件之前搜索目录。
【这里意思,是】
可以在与 (/X (忽略标准包含路径) ) 选项相同的命令行上使用此选项。
#include例如, #include “local.h” 可以在双引号 (或本地优先) 形式中指定指令。
或者,可以在尖括号中指定 (或包含路径优先) 形式,例如 #include 。
编译器会按以下顺序搜索目录: 如果指令是使用双引号格式指定的 #include ,则它首先搜索本地目录。 搜索在包含 #include指令的文件所在的目录中开始。 如果找不到该文件,它将在当前打开的包含文件的目录中的下一项搜索,其顺序与它们的打开顺序相反。搜索从父包含文件的目录中开始进行,然后继续向上到任何祖父包含文件的目录。
#include如果指令是以尖括号形式指定的,或者如果本地目录搜索失败,则它会按照命令行中指定的顺序搜索使用 /I 选项指定的目录。 在环境变量中 INCLUDE 指定的目录。【案,这一段更像是说明头文件的搜索的顺序】
3 VS头文件的包含路径的两种设置的不同
-
这两个包含路径本质上没有区别都是编译要用到的头文件和库,都可以用,只不过编译顺序对这两个设定有了约束【参考下一节】
-
区别仅仅是VC++ 目录,更像是环境变量中的Path,也就是它推荐应用的是其他工程中的头文件或者库
-
而C/C++,这更倾向于本项目用到的头文件和库,例如你要生成库,链接库还有生成可执行文件等等
4 再从编译顺序理解头文件设定不同:
头文件的优先顺序,主要的影响就是编译的时候,会遇到重复定义的情况,还有就是头文件之间的依赖关系也有先后。
MSVS的头文件的查找优先级别分3个级别,首先是从1开始,再到2,再到3,也就是1的优先级顺序比3高。
The compiler searches for directories in the following order:
1.Directories containing the source file.
源文件代码所在的文件夹中寻找头文件(即包含文件);
2.Directories specified with the /I option, in the order that CL encounters them.
在使用MSVC编译的时候,通过参数 /I 来指定的搜索目录;(相当于是“附加包含目录”设置的)
其中 /I 是由 C/C++ -> 常规-> 附加包含目录 来设置的。
3.Directories specified in the INCLUDE environment variable. 通过 LIB 环境变量指定的搜索目录;(相当于是“库目录”设置的) LIB 环境变量 是由 VC++目录 -> 包含目录 来设置的
【案,由此,我们可以看到,头文件编译加载的优先级C/C++要高于VC++目录,显然,本项目的头文件紧密相关应该置于C/C++的包含设定下比较合适,那么何时用VC++,当我们涉及到引用系统环境变量的头文件定义的时候,这一点,在很多开源软件例如PCL中,一般会强调自己要放在系统的环境变量里面,这样一次下载安装的PCL库,可以被你本地各个不同的项目来方便应用,VC++的这个设定显然是指的这种库,说到这里应该比较清楚了,希望对大家的理解有帮助】
5 再从链接的设定侧面验证一下:
In C++, you got the header files (.h), the (.lib) files and the (.dll) files.
In Visual Studio, you provide the location to search for these files in three different places:
Configuration Properties => C/C++ => General => Additional Include directories. Here you list out the “include” directories that you want searched and made available.
附加包含目录—添加工程的头文件目录:项目->属性->配置属性->C/C+±>常规->附加包含目录:加上头文件的存放目录;
Configuration Properties => Linker => General => Additional Library directories. Here you list out the “lib” directories that you want to be searched and made available.
附加库目录—添加文件引用的lib静态库路径:项目->属性->配置属性->链接器->常规->附加库目录:加上lib文件的存放目录;
Configuration Properties => Linker => Input => Additional dependencies. Here you explicitly specify the .lib files that want to include.
附加依赖项—添加工程引用的lib文件名:项目->属性->配置属性->链接器->输入->附加依赖项:加上lib文件名。
显然,链接库的设定取之于C/C++的设定项。
其他问题
包含目录和附加包含目录区别:
包含目录:修改了系统的include宏的值,是全局的;
附加包含目录:用于当前项目,对其他项目没有影响。
参考:
Visual Studio中C++的包含目录、附加包含目录和库目录和附加库目录的区别
VS中C++的包含目录、附加包含目录和库目录和附加库目录的区别