码迷,mamicode.com
首页 > Windows程序 > 详细

Windows 下动态链接库和静态链接库

时间:2016-01-21 23:42:40      阅读:359      评论:0      收藏:0      [点我收藏+]

标签:

1.静态链接库:就是在编译的时候把库中代码复制进工程中,导致工程变大,但是速度快。

缺点在于一套代码可能在内存中有多份拷贝,占用内存。

2.动态链接库:库由windos api加载库代码,内存中只有一份拷贝。工程中只保留链接到这份代码的引用,有两种动态链接库,

  (a)load time dynamic linking:工程运行的时候自动加载,结束时自动卸载

  (b) run time dynamic linking: 在工程运行过程中通过调用LoadLibrary()和GetProcAddress()函数加载库函数,用FreeLibrary()函数卸载

 

下面是实例:

1. 静态库:

通过vs创建win32的静态库,工程名为libTest,加入lib.h, lib.cpp

#ifndef LIB_H
#define LIB_H

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

#endif
#include "lib.h"

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

代码简单,不解释。编译后生成libTest.lib文件。

我们需要把.lib文件和lib.h文件拷贝到引用的工程中(或者可以把.lib文件通过配置link指定)

新建工程进行引用:

#include "lib.h"
#pragma comment(lib, "testLib.lib");

int _tmain(int argc, _TCHAR* argv[])
{
    printf("2+3= %d", add(2, 3));
    while(1) ;
    return 0;
}

关键是

#pragma comment(lib, "testLib.lib");指令

2.动态库:

新建项目win32的dll,名字dllTest,加入3个文件,lib.cpp, lib.h, lib.def,代码如下:

//dll.h
#ifndef LIB_H
#define LIB_H

extern "C" int __declspec(dllexport) add(int x, int y);

#endif


//===================dll.cpp=======================
#include "lib.h"

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

//---------------------------------dll.def-----------------------------------
LIBRARY dllTest2
EXPORTS
add @1

.def文件表明了要导出哪些函数,导出的库名字。@后面是函数编号,前面是函数名字。

编译后生成dllTest.lib, dllTest.dll,其中.lib文件用于load time dynamic linking,只是和静态库一样的调用方式,提供一个到dll的引用

(1)run time dynamic linking(只要dll文件):

#include <Windows.h>
#include <stdio.h>

typedef int (*lpAddfun)(int, int);
//定义一个函数指针

int main()
{
    HINSTANCE hDll;  //dll的句柄
    lpAddfun addFun;    //函数指针变量

    hDll = LoadLibrary(TEXT("dllTest2.dll")); 
    if(hDll != NULL)
    {
        addFun = (lpAddfun)GetProcAddress(hDll, "add");
        if(addFun != NULL)
        {
            int result = addFun(2, 3);
            printf("%d", result);
        }
        FreeLibrary(hDll);
    }
    while(1);
    return 0;
}

(2)load time dynamic linking(既要.lib又要.dll)

#pragma comment(lib,"dllTest.lib")

extern "C" __declspec(dllimport) add(int x,int y);

int main(int argc, char* argv[])
{
    int result = add(2,3);
    printf("%d",result);
    return 0;
}

 

Windows 下动态链接库和静态链接库

标签:

原文地址:http://www.cnblogs.com/bubbler/p/5149770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!