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启动时候加载到进程中

猜你喜欢

转载自www.cnblogs.com/zhaoyixiang/p/12965743.html