• C++中动态链接库的一些概念及入门(1)


       C++中的动态链接库说简单点也就是函数类库,大都以dll为后缀,和.net的程序集采用同样的后缀,但是比起.net中调用和编写就要麻烦很多,其中有一些概念需要了解清楚才能更好的去理解和使用动态链接库:

    一、概念介绍

       首先要了解静态库和动态库的区别:

    静态库:函数和数据被编译成一个lib文件,在编译和链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件。

    动态库:使用动态库的时候,需要2个文件,一个引入库文件(*.lib)和一个DLL(.dll)文件。这里也是以lib为后缀,但是这个引入库的lib文件和静态库的lib文件完全不是一回事。引入库的lib文件包含该dll导出的函数和变量的符号名,而dll文件包含该dll实际的函数和数据。如果使用动态库作为函数类库,在编译链接可执行文件时,只需要这个库的引入库lib文件,该DLL不复制到可执行文件中。直到可执行程序运行时,才去加载dll。

      ps:因此使用dll的话,dll可以不需要,只需要lib文件,运行时lib文件可以不要,但是dll文件需要

    二、如何编写静态库

    1、新建一个工程,选择"Win32 Static Library”,这里名称取为StaticLib

    image

    建好工程,我们编写自己的函数库,这里用于熟悉dll的写法及调用,做一个加法函数add

         1、新建一个c++文件

    代码如下,很一般的C++代码

    #include "stdafx.h"

    int add(int x,int y)
    {
        return x+y;
    }

    函数写好了,编译链接Build生成lib文件(即静态库文件)

         2、建立客户端程序使用这个静态库

              新建一个控制台应用程序,取名为ClientApp,这里我们需要调用StaticLib的add函数,所以我们需要声明那个函数,使用extern关键字对这个函数进行作用范围的扩大

          在ClientApp.cpp中添加函数签名

          extern int add(int x,int y);

         然后我们在main函数中如我们自己在这个工程下写的这个add函数一样像add(5,4)这样的方式来调用它,完整的ClientApp.cpp代码如下:

    #include "stdafx.h"
    #include "stdio.h"
    extern int add(int x,int y);
    int main(int argc, char* argv[])
    {
        int a=add(5,4);
        printf("result:%d\n",a);

        return 0;
    }

    好,编译一下,很兴奋:0 error(s),0Warning(s)

    image

    然后Build一下,沮丧的事情发生了,连接出现错误了error LNK2001: unresolved external symbol "int __cdecl add(int,int)" (?add@@YAHHH@Z)

    image

    前面的StaticLib生成的lib文件在我们客户端程序中只是简单的做了个extern函数声明,可是真正函数实现ClientApp到哪里去找呢?链接的时候不知道,这里有两种方式解决:

       办法1、在ClientApp.cpp中添加导入库代码:#pragma comment(lib,"..\\debug\\vcdll.lib")

       办法2、或者在工程链接的时候添加这个库的链接选项,具体设置在菜单Projects-Setting,选中ClientApp这个工程,再选中Link选项卡

    image

    设置好后,重新生成,通过,运行结果如下

    image 

    一切那么美妙,按照我们预想的输出了。

    本想做一个篇幅讲的,介于太长,下篇介绍动态库的编写及调用

    Technorati 标签: dll,动态链接库,入门,调用
  • 相关阅读:
    一个开始搞Linux的现任前端开发,用U盘装CentOS
    .NET:处理数据库事务中的并发
    Xml与对象之间的序列化、反序列化
    嵌套类
    .NET陷阱之五:奇怪的OutOfMemoryException——大对象堆引起的问题与对策
    backbone 之事件(events)
    一道笔试指针题目详解
    linux安装Cassandra数据库
    Angularjs Controller 间通信机制
    NLucene 和 Lucene .NET
  • 原文地址:https://www.cnblogs.com/yukun/p/1662317.html
Copyright © 2020-2023  润新知