Visual Studio中C++的包含目录、附加包含目录和库目录和附加库目录的区别

Visual Studio中C++的包含目录、附加包含目录和库目录和附加库目录的区别

前言:最近做opencv的配置与开发的时候发现opencv我们有多种配置方式,在项目属性里面有几个很重要的配置概念,重点是下面四个,包含目录、附加包含目录、库目录、附加库目录,那么到底有什么区别呢?

一、opencv配置简介

在配置opencv的时候必须要配置三样东西

  • 头文件包含路径:即所谓的  包含目录  或者是  附加包含目录
  • 库文件路径:即所谓的  库目录  或者是  附加库目录
  • 附加链接库:

对于头文件和库文件的配置,有两种方式可以实现,

Visual Studio C++工程中,右键一个Project,可以发现有两个地方设置Include的相关目录和lib的相关目录,分别如下:

1. VC++ 目录 -> 包含目录与库目录

Visual Studio中C++的包含目录、附加包含目录和库目录和附加库目录的区别


2. 附加包含目录与附加库目录

这两个不在一个选项卡中,分别在不同的选项卡。如下:

C/C++ -> 常规 -> 附加包含目录

链接器 ->常规 -> 附加库目录

Visual Studio中C++的包含目录、附加包含目录和库目录和附加库目录的区别

Visual Studio中C++的包含目录、附加包含目录和库目录和附加库目录的区别

那么它们之间到底有什么区别呢?

(1)包含目录 vs 附加包含目录

其实他们最大的不同仅仅是在于编译器寻找头文件的顺序不同而已,如下:

MSVC编译器寻找头文件的顺序(这里与前面的那篇文章里面讲的Ming-w64中GCC和G++的搜索顺序是一样的):

  1. 源文件代码所在的文件夹中寻找头文件(即包含文件);
  2. 在使用MSVC编译的时候,通过参数 /I 来指定的搜索目录;(相当于是“附加包含目录”设置的)
  3. 通过 INCLUDE 环境变量指定的搜索目录;(相当于是“包含目录”设置的)

注意:

  1. 其中第二个顺序中的 /I 是由 C/C++ -> 常规-> 附加包含目录  来设置的。
  2. 而第三个顺序中的 INCLUDE 环境变量 是由  VC++目录 -> 包含目录  来设置的。

(2)库目录 vs 附加库目录

同上面的道理,

MSVC编译器寻找库文件(主要是指静态库,因为在编译的时候只需要静态库,动态库是在运行的时候才需要的)的顺序:

  1. 源文件代码所在的文件夹中寻找库文件(即静态库文件);
  2. 在使用MSVC编译的时候,通过参数 /link 来指定的搜索目录;(相当于是“附加库目录”设置的)
  3. 通过 LIB 环境变量指定的搜索目录;(相当于是“库目录”设置的)

注意:

  1. 其中第二个顺序中的 /link 是由 链接器 -> 常规-> 附加包含目录  来设置的。
  2. 而第三个顺序中的 LIB 环境变量 是由  VC++目录 -> 包含目录  来设置的。

所以在VS中开发C++程序,我们可以通过上面的两种方式去选择配置。

有人推荐

就是说我们一般使用  C/C++和链接器 下面的设置,而一般不建议使用  VC++目录  下面的设置,个人觉得这么做的原因是因为前者的搜索顺序在前面,所以优先使用,而且不需要环境变量,但是对于VS来说,我个人感觉差别不大,及遍布设置环境变量,依然可以使用,参见我的另一篇文章:

VSCode开发C、C++环境搭建系列(三)——基于MSVC搭建

 

(3)附加链接库的指定

这是最后一步,附加链接库的指定,即显示的指明在 库目录 中,显示指定链接到哪一个静态库文件,指定的方式都是一样的:

Visual Studio中C++的包含目录、附加包含目录和库目录和附加库目录的区别