zoukankan      html  css  js  c++  java
  • Windows核心编程——动态库和静态库

    1.静态库:

         我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。
     Linux下的静态库为lib*.a格式的二进制文件(目标文件),对应于Windows下的.lib格式的文件。

     问题:

    只给出头文件和obj文件能否编译成功?

    测试:只用.h和obj文件进行测试

     会报错链接错误,找不到实现

     
    需将obj添加至工程(链接-->输入-->附加依赖项)

     

     这样就能使用.h和 .obj

        注意:c语言使用要添加extern "C"关键字。
        
         __cplusplus -- 编译器提供的宏,如果是cpp文件,则宏会被定义,如果是c文件,则此宏不会被定义
        
         同时兼容c和c++语法的头文件:

             #ifdef __cplusplus
            extern "C" {
            #endif
        
            int Sub(int nVal1, int nVal2);
        
            #ifdef __cplusplus
            }
            #endif // __cplusplus
    

          

    工程里的obj太多怎么办?

    我们需要引入静态库技术,即(所有obj合成一个文件,文件后缀.lib)

    静态库创建:

    创建windos桌面向导->静态库工程
    然后放进去,重新生成解决方案,得到lib.lib静态库

     
    使用静态库:
              将头文件.h和.lib文件放入新文件再同时再添加.lib.

    静态库优缺点:

     

     2.动态库

    动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。

    库代码在exe运行时加载进去

    为什么要使用动态库?

       当动态库内容需要更新时,只需更新dll文件就可对啊a,b,c文件全部更新,更具有灵活性。

    如何制作动态库:

            桌面 向导->dll->将.h. cpp  放入     __declspec(dllexport) -- 指出dll中需要导出的函数、变量、类。    

    如何使用dll

            1)头文件+.lib 拷过去
            2)lib添加到工程中(同前面)  
                或者 添加头文件#pragma comment(lib,"dll.lib")
                
                添加以下内容:
                
                __declspec(dllexport) -- 指出dll中需要导出的函数、变量、类     
                 __declspec(dllimport) --指出导入
                
                或者:我们直接用宏兼容两种创建一个common.h
               

       #pragma once
                       #ifdef DLL_EXPORT
                #define DLL_API __declspec(dllexport)
                #else
                #define  DLL_API __declspec(dllimport)
                #endif // 
    

                添加:        

      #ifdef __cplusplus
                extern "C" {
                #endif
            
                    DLL_API int Add(int nVal1, int nVal2);
                    DLL_API extern int g_nTest;
            
                #ifdef __cplusplus
                }
                #endif // __cplusplus
    

     
                
            3)在预处理选项添加DLL_EXPORT

       4). dll需放在.exe文件下(若不在会报以下错误)

     

          dll.lib作用:告诉连接器,某些接口实现在某个dll中,在链接阶段不用去实现,其
    实现会在exe启动时候加载到进程中

  • 相关阅读:
    数据库之case when + group by 联合使用
    JAVA之JSON对象解析
    oracle导入表数据时遇到外键约束问题导致导入失败
    Oracle之会话阻塞
    cmd的操作命令导出导入.dmp文件
    性能优化理解
    JS原型与原型链的理解
    Promise实现原理
    Js运行机制Event Loop
    JS循环中断与异步for...in forEach map
  • 原文地址:https://www.cnblogs.com/zhaoyixiang/p/12965743.html
Copyright © 2011-2022 走看看