C++ 技术中心

   :: 首页 :: 联系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

郑重声明:本BLOG所发表的原创文章,作者保留一切权利。必须经过作者本人同意后方可转载,并注名作者(天空)和出处(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新随笔

最新评论

评论排行榜

一.静态库
         用通俗的话讲,静态库就是将代码编译到一个二进制文件下(通常扩展名为.LIB).然后客户
端调用程序,只需要包含相关的.h文件及LIB库文件一起链接到exe文件中.可执行程序发布后,不
再需要该.lib文件了.

二.动态库
   最终将编译出.lib与.dll文件. 注意.lib文件与上面的静态库虽然扩展名相同,但有本质的
   区别.动态库中的lib文件是动态库的引入库. 该引入库包含被DLL导出的函数和变量的"符号
   名".而静态库中的.lib包含了函数和数据,动态库的函数和数据是编译到.dll中.动态链接库调
   用方式分为隐式调用与显示调用(也称静态调用与动态调用)。

三.静态库的使用
1.下面来看看如何生成一个静态库
  
   (1)新建静态库工程,新建DllStaticLib.h及新建DllStaticLib.cpp文件
   (2)DllStaticLib.h代码如下:
   #ifndef _DLL_STATIC_LIB_H__
   
#define _DLL_STATIC_LIB_H__

   
extern "C"{
      
int add(int x,int y);
   }



   
#endif/*_DLL_STATIC_LIB_H__*/
   (3)DllStaticLib.cpp代码如下:
   #include "DllStaticLib.h"
   #include 
"stdafx.h"

   
int add(int x,int y)
   
{
        
return x+y;
   }

(4)最终生成DllStaticLib.lib静态库文件
2.调用静态库
  (1)现在只要使用DllStaticLib.lib,DllStaticLib.h文件.
     (注意让VC能搜索到该文件,设置VC相关的包含目录与库目录.
    
  (2)调用代码如下:
#include "stdafx.h"
#include 
<conio.h>
#include 
"DllStaticLib.h"//要设置VC包含目录,以便编译时能找到头文件

//要设置VC库目录,以便编译链接时可以找到该DllStaticLib.lib
#pragma comment(lib,"DllStaticLib.lib")

int main(int argc, char* argv[])
{
    printf(
"%d\n",add(3,5));

    _getch();
    
return 0;
}

四. 动态链接库的使用
1.生成动态链接库
  (1)新建动态链接库工程,加入TestDll.h及TestDll.cpp文件
  (2)TestDll.h代码如下:
#ifndef _TEST_DLL_H__
#define _TEST_DLL_H__

#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif

extern "C" TESTDLL_API int sum(int x,int y);

#endif/*_TEST_DLL_H__*/

 (3)TestDll.cpp代码如下:
#include "TestDll.h"

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

  (3)注意,将工程中设置属性定义TESTDLL_EXPORTS宏,以便确定该工程为DLL导出
  (4)最终生成TestDll.lib及TestDll.dll文件

2.隐式调用Dll库
  (1)新建win32控制台工程,加入DllClient.cpp
  (2)示例代码如下:
#include <iostream>
#include 
<conio.h>
#include 
"TestDll.h" //要设置VC包含目录,以便编译时能找到头文件
using namespace std;


//要设置VC库目录,以便编译链接时可以找到该DllStaticLib.lib
#pragma  comment(lib,"TestDll.lib")

int main(int argc,char *argv[])
{

    printf(
"%d\n",sum(8,9));
    _getch();
    
return 0;
}

(3)说明,隐式调用需要lib文件,但是exe编译后,就不再需要lib,只需要dll文件即可.
     以下显式调用不需要lib文件,只需要提供dll文件.随exe运行与结束装载或释放dll文件.

3.显式调用Dll库
(1)同上新建win32工程.加入cpp文件,代码如下:

#include <iostream>
#include 
<conio.h>
#include 
<windows.h>
using namespace std;

typedef 
int FUN_SUM(int x,int y);

int main(int argc,char *argv[])
{

    HINSTANCE hDll; 
//DLL句柄

    hDll 
= LoadLibrary(L"TestDll.dll");
    
if (hDll != NULL)
    
{
        FUN_SUM 
*sum = (FUN_SUM*)GetProcAddress(hDll, "sum");
        
if(sum)
        
{
            cout
<<(*sum)(9,10)<<endl;
        }

        
else
        
{
            cout
<<"获取sum函数指针失败!"<<endl;
        }


        FreeLibrary(hDll);
    }

    
else
    
{
        cout
<<"装载TestDll.dll失败!"<<endl;
    }

    _getch();
    
return 0;
}


(2)显式链接在程序运行中可以把DLL的内存动态映射到调用进程的地址空间。释放可按需释放,使用更灵活.

posted on 2011-03-10 15:48 C++技术中心 阅读(2792) 评论(1)  编辑 收藏 引用 所属分类: Windows 编程

Feedback

# re: 静态链接库与动态链接库使用详解 2013-09-30 18:03 岁月漫步
早年看到这个文章就好了,当时学的时候很迷糊,现在已经清楚了,才看到了  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理