Windows 下 的静态库和动态库

   一、静态函数库(Lib)

     1. 静态函数库的制作(C/C++)

       —— 打开新建项目,然后选中Win32项目,接着在创建项目中选择 Lib,再接着将函数、实现功能的代码写入文件中,最后点击生成 目标文件 (.lib文件)

       —— 生成的目标文件(Lib)默认在解决方案中的Debug目录下  

     2 . 静态函数库的调用

       在Win32项目中调用步骤如下:

          i. 声明调用目标函数

          ii. 给链接器 指定链接库的 类型、库相对位置   —— #pragma comment(lib,''../Debug/CLib.lib'')

  二、动态函数库(Dll)

    1. 动态函数库的制作(C/C++)

      —— 打开新Win32项目,选中Dll 选项,向目标文件写 函数实现代码,最后点击生成

        制作动态库步骤:

            i. 创建动态库项目

            ii. 添加库程序

            iii. 库程序导出   ——   declspec(dllexport) + 库函数

      —— 生成的动态库位置在解决方案中Debug目录下

    2. 动态库的使用

      i. 声明并导入动态库函数  —— declspec(dllimport)+ 库函数

       链接时会生成相应的静态库文件,保存着函数中的编号, 方便能够准确找到函数

      ii. 导入函数库 —— #pragma comment(lib,"../Debug/CppLib.lib") //编译器去静态库找编号

      iii. 在程序中使用函数

      iv. —— 隐式链接的情况,Dll文件可以放在以下路径中

        1. 与执行文件 在同一个目录下

        2. 当前工作目录

        3. Windows目录

        4. Windows/System32目录

        5.Windows/System

        6.环境变量PATH指定目录

      —— 显示链接

        链接步骤:

        1. 定义函数指针类型 typedef

         typedef  int (*DLL_ADD) (int m,int n);

        2. 加载动态库

         HMODULE LoadLibrary(LPCTSTR lpFileName  //动态库路径);返回dll的实例句柄(HINSTANCE))

        3. 获取函数地址

         FARPROC GetProcAddress(HMODULE hModule// Dll句柄, LPCSTR lpProcName//函数名); 成功返回函数地址

        4.使用函数

        5. 卸载动态库

        BOOL FreeLibrary(HMODULE  hModule);        

        

        导出类

     头文件:

        #ifndef __DLLCLASS_H

        #define __DLLCLASS_H

        #ifdef DLLCLASS_EXPORTS

        #define EXT_CLASS  _declspec(dllexport)

        #else

        #define EXT_CLASS  _declspec(dllimport)

        #endif        

        class EXT_CLASS CMath {  };

    cpp文件

        #define  DLLCLASS_EXPORTS

        #include "DllClass.h"

        int CMath::Add (int num1, int num2);

    应用程序要运行动态库里的文件,会先检查所需文件是否能够找到并无错误,再才会跑起应用程序

    

      

    

  

最新文章

  1. 【转】C# lock的使用
  2. MSCRM 获取列表所选记录相关信息
  3. Hadoop简单安装配置
  4. excel快速复制大量公式的方法
  5. LA 4384
  6. Vim的tagbar插件
  7. SQLite的查询
  8. pl/sql developer 中文字段显示乱码
  9. OAuth在WebApi中的使用,前后台分离的调用方式
  10. Java工作队列和线程池
  11. 记录IOS入门的过程
  12. InvalidArgument=Value of '1' is not valid for 'index'
  13. 最新 xode shareSDK使用分享
  14. DrawerLayout、CoordinatorLayout、CollapsingToolbarLayout的使用--AndroidSupportDesign练手
  15. Swift - 判断设备方向(或监听设备方向的改变)
  16. uva-442 Matrix Chain Multiplication
  17. Codeforces Round #396 (Div. 2)
  18. Android项目开发填坑记-9patchPng报错
  19. 实验五Java网络编程及安全
  20. perl 脚本将phred33 转换为phred64

热门文章

  1. USACO zerosum DFS 1A
  2. Android Application Digital Signatures - Android 数字签名
  3. ALSA声卡驱动中的DAPM详解之一:kcontrol
  4. 华为FusionSphere概述——计算资源、存储资源、网络资源的虚拟化,同时对这些虚拟资源进行集中调度和管理
  5. AngularJS2.0 一个表单例子——总体说来还是简化了1.x 使用起来比较自然
  6. Coursera Algorithms week4 基础标签表 练习测验:Inorder traversal with constant extra space
  7. shell脚本-高级变量
  8. Akka源码分析-ActorSystem
  9. 基于Spark Streaming预测股票走势的例子(一)
  10. SQL SERVER 获取给定时间段内的所有日期列表