包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何使用? 及静态库,动态库的创建与调用和vs里引用的使用
发布日期:2021-06-30 13:53:12 浏览次数:2 分类:技术文章

本文共 2364 字,大约阅读时间需要 7 分钟。

引言:vs中怎么添加外部头文件?

如过直接在项目头文件处,添加一下,如下图:

否则,依然会报错,如下图:

有两种方法,来解决(你不在vs上的添加它也没事):

(1) 直接把外部头文件复制过来,放在此项目下即与该项目cpp文件同一目录,如下图:

(2)项目右键,属性里的C/C++   - > 常规,附加包含目录里添加头文件的所在目录路径

或者放在,项目右键,属性里的VC++目录 --->包含目录,包含目录里添加头文件的所在目录路径

vs中包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何正确使用?

见如下博客:

 编译器在编译过程中查找包含目录(Include文件)的顺序:

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.
  3. Directories specified in the INCLUDE environment variable.

其中step2中的/I是由C/C++ -> General -> Additional Include Directories设置的。 

而step3中的INCLUDE是由VC++ Directories -> Include Directories设置的。 

所以从这里看出,不同的设置有不同的编译链接顺序。

静态库,动态库的创建与调用

本人的经验:

    1.不附加与附加的目录或库,用哪个可以。

    2.调用静态库、动态库

    (1)调用静态链接库

        使用静态链接库时(如调用里面的函数),首先要把静态链接库的头文件包含在项目的里(即写#include "xxxx.h")。

        方法一:复制头文件及lib文件到该项目下,然后在属性-链接器-输入-附加依赖项里加入xxx.lib。

        方法二:(附加)包含目录,就是指定lib的h文件路径,然后在属性-链接器-输入-附加依赖项里加入xxx.lib。

        方法三:在代码中,添加 #pragma comment(lib, "XXX.lib") 并且填加相应的xxx.h头文件。

     (2).调用动态链接库

          静态调用:

         首先首先要把库用到的头文件包含在项目的里(即写#include "xxxx.h")。

         方法一:复制h文件,lib文件和dll文件到该项目下(即项目的cpp文件同目录下)。,或者将dll放在exe文件的同文件夹里,然后在属性里的附件依赖项里加入xxx.lib。

        方式二:(附加)包含目录,就是指定lib的h文件路径,再将xxx.dll复制到你的项里(即项目里有cpp文件的那个目录),或者将dll放在exe文件的同文件夹里,然后在属性里的附件依赖项里加入xxx.lib。

        我发现在Qt项目里,只能使用附加包含目录和附件库目录,才有效

       

h头文件 .lib库文件 .dll动态链接库文件关系

  • .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。
    附加依赖项添加的是.lib而不是.dll,若生成了DLL,则肯定也生成了LIB文件。
  • H文件的作用:声明函数接口
  • DLL文件作用:函数可执行代码
  • LIB文件作用:当我们在自己的程序中引用了一个H文件里的函数,链接器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用了。它告诉链接器调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项.LIB文件,它起到桥梁的作用。
  • 如果是生成静态库文件,则没有DLL,只有lib,这时函数可执行代码部分也在lib文件中。

再说一点

    目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。

    静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。

    一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。

参考博客:

vs中引用的用法:

我们在开发过程中,经常会使用别人的库,即静态链接库lib或动态链接库

在引用里引用创建为lib或dll的项目,然后再在该项目属性-包含目录里包含头文件路径(或者把头文件都复制到你的项目cpp文件所在文件里)

此时不用再像前文那样设置库目录了与附加依赖项了,就可以直接在项目cpp文件里包含头文件(即写#include "xxxx.h"),直接调用lib或dll项目里的函数了。

转载自:

转载地址:https://jensen-lee.blog.csdn.net/article/details/86689664 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:用OpenCV调用手机摄像头
下一篇:几何重数与代数重数

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月28日 09时45分03秒