VS动静态库之封装-使用(1)

一、前言

  之前学过,没有留下笔记,现在忘记的差不多了,现在重新学习,并记录下来。

二、使用库的好处

2.1 为什么要使用库

  • 封装底层代码,只保留使用接口,供上层使用,用户无需关注具体实现方式
  • 方便开发部门间合作,只需要传递库文件(.dll或者.lib文件)
  • 使得工程更加简洁(除了自己的代码,其他的全是库文件)

2.2 动态库和静态库的区别

  • 静态库随程序一起加载。

    优点:是发布项目文件少,只有一个运行文件。

    缺点:更新不方便,每次更新需要更新全部内容。

  • 动态库在程序启动后,被调用才加载。

    优点:更新方便,只需要替换对应的组件,无需全部更新,现在程序发布的主流方式。

    缺点:发布文件过多。

2.3 完整库的一般组成

  • 一个库文件
  • 一个或多个头文件
  • 依赖库,无需头文件,因为已经被编译到主库之中。

2.4 一般查看工具

  • depends 动态库查看工具

  • vs自带工具,在命令行输入以下命令,即可查看动态库

    1
    D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>dumpbin /exports D:\WorkSpace\DLLTutorial\Debug\DLLTutorial.dll
  • vs自带工具,在命令行输入以下命令,即可查看静态库

    1
    dumpbin   /LINKERMEMBER   vpxmtd.lib

三、库的生成

  • 系统:win10
  • 工具:vs2013

3.1 静态库的生成与测试

3.1.1 建立工程
  • 文件->新建->项目->win32项目

3.1.2 编写代码
  • 建立文件LibTest.h,写入以下代码

    1
    2
    3
    4
    5
    6
    7
    #ifndef LIBTEST_H
    #define LIBTEST_H

    extern "C" int sum(const int x, const int y);
    extern "C" int sub(const int x, const int y);

    #endif
  • 建立文件LibTest.cpp,写入以下代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "stdafx.h"
    #include "LibTest.h"

    int sum(const int x, const int y)
    {
    return x + y;
    }

    int sub(const int x, const int y)
    {
    return x - y;
    }
  • 生成解决方案,成功和失败都会有提示,生成文件为:

    test.lib 内容实体,导入即可使用

    test.pdb 调试文件,内含源码

  • 其他说明

    在cpp文件中一定要包含stdafx.h头文件,这个文件里面包含了生成lib文件的配置信息,一般不需要修改。注:只有接口.cpp才需要包含。

3.1.3 工具测试
  • 使用VS自带工具进行测试,测试结果如下图。

    出现接口,则表示成功。

3.1.4 github工程代码

  链接附上:https://github.com/coldspace/VSDllLib/tree/master/test

3.2 动态库生成与测试

3.2.1 建立工程
  • 文件->新建->项目->win32项目

3.2.2 编写代码
  • 建立文件dlltest.h,并写入以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #ifndef DLLTEST_H
    #define DLLTEST_H

    #define dll_export

    #ifdef dll_export
    #define CALL_Dll extern "C" __declspec(dllexport) // 此时为生成dll,为保证兼容,限制以C的方式
    #else
    #define CALL_Dll extern "C" __declspec(dllimport) // 此时为导入dll,为保证兼容,限制以C的方式
    #endif

    CALL_Dll int sum(const int x, const int y);
    CALL_Dll int sub(const int x, const int y);

    #endif
  • 建立文件dlltest.cpp,并写如以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "dlltest.h"

    int sum(const int x, const int y)
    {
    return x + y;
    }

    int sub(const int x, const int y)
    {
    return x - y;
    }
  • 生成解决方案,生成文件为

    dlltest.dll 内容函数实体

    dlltest.lib 函数地址,以供编译器使用

    dlltest.pdb 调试使用,内含源码信息

    使用时,需要将dlltest.dll和dlltest.lib放入同一文件夹,编译时只需导入dlltest.lib即可。

  • 其他说明

    C++允许重载,C不允许。限制以C的方式导出,可以防止生成dll时,函数名重复编码。

3.2.3 工具测试
  • 使用vs自带的工具进行测试,测试结果如下图

    出现红框框部分,说明成功

3.2.4 github工程代码

  链接附上:https://github.com/coldspace/VSDllLib/tree/master/dlltest

四、总结

  静态库生成使用的是向导,系统自带了一些文件,虽然功能全面,但不是很喜欢,没有dll生成方式简洁,后期找找其他方法,库的使用见下文。

-------------本文结束感谢您的阅读-------------
0%