动态库

  • 动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据

    • dll 并不是所有数据都能被访问到,必须要进行导出

  • 动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用

  • 生成动态链接库的时候会附带一个 lib,这个lib叫做导入库

    • 导入库同于提供导出函数和数据在 dll 中所处的位置,不提供代码

    • 如果使用隐式链接的方式使用动态链接库,必须要 dll 文件

  • 动态链接库的创建

  • //老师演示的时候是生成两个文件。一个header.h。一个.cpp。
    //自己复习的时候,创建完生成了4个文件:header.h targetver.h dllmain.cpp 动态库2.cpp
  • 方法一:声明导出

    1.创建动态库文件

    2.写文件信息

    3.运行。

  • DLL 程序的入口函数(了解),可写可不写的函数

  • (写在dllmain.cpp,函数定义也写在这)

    // DLL 程序的入口函数,会在不同的情况下被调用
    BOOL APIENTRY DllMain( HMODULE hModule,
                          DWORD  ul_reason_for_call,
                          LPVOID lpReserved
                        )
    {
       return TRUE;
    }
  • 函数的导出方式:使用声明进行导出

  • (写在header.h)

    • DLL 导出的函数不应该有名称粉碎,所以需要使用 extern "C" 取消名称粉碎

    #ifdef _USRDLL
    // 如果是 dll 表示我需要声明导出函数
    #define DLLAPI extern "C" _declspec(dllexport)
    #else
    // 如果是普通文件需要声明使用的是导入到当前程序的函数
    #define DLLAPI extern "C"_declspec(dllimport)
    #endif

    // 声明函数
    DLLAPI void show1();
    DLLAPI void show2();
    DLLAPI void show3();
  • 方法二函数的导出方式:使用模块定义问文件进行导出

    1.创建动态库文件

    2.写文件

    3.设置模板定义

    4.运行

  • (写在header.h)

    // 声明函数
    void show1();
    void show2();
    void show3();
    //直接声明函数,相比方法一,不需要DLLAPI宏定义声明来粉碎名称。
  • 新建一个文件,后缀名改def。名称随意。内容如下。

    • 模块定义文件自己会取消名称粉碎,推荐使用

    EXPORTS
    show1 @ 1
    show2 @ 2
    show3 @ 3
  • 动态链接库的使用方式

    • 显示的使用动态链接库

    // 2. 显示连接,依赖于一组API
    HMODULE hModule = LoadLibrary(L"../Debug/04. 动态库和静态库.dll");

    // 2.1 如果返回值非 0, 就获取函数
    if (hModule) fun = (pfun)GetProcAddress(hModule, "show1");

    // 2.2 如果函数非空,就调用函数
    if (fun) fun();
    • 隐式链接使用动态连接库

    // 1. 使用隐式链接的方式调用导出函数
    #include "../04. 动态库和静态库/framework.h"
    ////需要把生成的头文件拷贝到该文件下才能包含成功/////
    #pragma comment(lib, "../Debug/04. 动态库和静态库.lib")
    ////生成的动态lib文件,可以不在该文件目录下////

    // 1.1 调用隐式链接的函数
    show1();

// 包含头文件是为了获取函数的声明

  
 

#### 静态库

- 静态库的创建


- 静态库会生成一个 lib 文件,提供了所有的代码,又叫做**对象库**

- (此处截图用的跟上面动态同一个文件,只是更改了生成方式)



#### 静态链接库和动态链接库的区别

- 使用 dll 的程序必须自带 dll,使用 lib 的程序可以不带 lib
- 使用 dll 的程序通常比较小,使用 lib 的程序通常比较大
- 使用 lib 的程序可以进行跨平台
- 静态链接库的 lib 和 的动态链接库的 lib 不同,分别是对象库和导入库

11

C_动态库|静态库的更多相关文章

  1. Linux 下动态库 / 静态库(依赖)

    一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...

  2. C++基础知识之动态库静态库

    一. 静态库与动态库 库(library),一般是一种可执行的二进制格式,被操作系统载入内存执行. 我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库 静态库和动态库区别: ...

  3. linux 动态库 静态库 函数覆盖

    本文讨论了linux动态库  静态库中函数的覆盖问题. 测试目的: 同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另 ...

  4. Linux 动态库 静态库

    什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和Linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的库函数分为静态库和动态库 ...

  5. CMake 添加头文件目录,链接动态、静态库(添加子文件夹)

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  6. c/c++:动态库 静态库 linux/windows 例子 (转)

    作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...

  7. cmake 添加头文件目录,链接动态、静态库(转载)

    来源网址:http://www.cnblogs.com/binbinjx/p/5626916.html 罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目 ...

  8. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

  9. golang 编译或链接 c语言动态、静态库的方法, golang 与 c语言 相互调用

    1.golang链接c静态库的方法可以见这个示例: https://github.com/atercattus/go-static-link-example https://github.com/sh ...

随机推荐

  1. hdu 4778 Gems Fight!

    第一次写状压dp-- 题意:http://blog.csdn.net/dyx404514/article/details/15506601 状压dp+博弈吧-- #include<iostrea ...

  2. [BestCoder Round #3] hdu 4907 Task schedule (模拟简单题)

    Task schedule Problem Description 有一台机器,而且给你这台机器的工作表.工作表上有n个任务,机器在ti时间运行第i个任务,1秒就可以完毕1个任务. 有m个询问,每一个 ...

  3. 容器ConcurrentHashMap原理(学习)

    一.概述 HashMap 是非线程安全的,在不考虑性能问题的时候,我们的解决方案有 Hashtable 或者Collections.synchronizedMap(hashMap),这两种方式基本都是 ...

  4. SpringMVC_1

    //@SessionAttributes(value={"user"},types={String.class}) @Controller public class SpringM ...

  5. react-native 项目更名步骤

    刚开始开发项目的时候,更没有想好一个项目名称,如何才能更名一个RN APP名称呢,可按照如下方式操作即可. 使用说明 更改package.json { "name": " ...

  6. 【Unity3D】Unity3D SkinnedMeshRenderer换装系统

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/6505561.html 一.换装原理 游戏角色换装分为以下几步: 1.替换蒙皮网格 2.刷新骨骼 3.替换材质 上 ...

  7. PyCharm创建文件时自动添加头文件

    依次找到以下路径: File->settings->Editor->File and Code Templates->Python Script  #!/usr/bin/env ...

  8. bzoj 1691: [Usaco2007 Dec]挑剔的美食家【贪心+splay】

    高端贪心,好久没写splay调了好久-- 以下v为价格,w为鲜嫩度 把牛和草都按v排升序,扫草,首先把v小于等于当前草的牛都丢进splay,这样一来splay里全是可选的牛了,按w排序,然后贪心的为当 ...

  9. mysql——免安装配置

    1.下载 (1)下载地址:https://dev.mysql.com/downloads/mysql/ (2)选择下载 2.配置环境变量 (1)解压目录:D:\mysql-8.0.16-winx64 ...

  10. Linux安装PHP环境

    简介: PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要 ...