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(, ));
while() ;
return ;
}

关键是

#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 @

.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(, );
printf("%d", result);
}
FreeLibrary(hDll);
}
while();
return ;
}

(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(,);
printf("%d",result);
return ;
}

Windows 下动态链接库和静态链接库的更多相关文章

  1. Linux下动态链接库和静态链接库

    第一部分:编译过程 先了解一下linux下C代码的编译过程,C代码的编译,一般分成四个阶段,包括:预编译,编译,汇编和链接,这四个阶段的分工是 预处理过程,负责头文件展开,宏替换,条件编译的选择,删除 ...

  2. [转载]GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

    来自http://blog.csdn.net/benpaobagzb/article/details/51364005 GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有 ...

  3. Qt 共享库(动态链接库)和静态链接库的创建及调用

    前言: 编译器 Qt Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sh ...

  4. Linux环境下c语言静态链接库和动态链接库创建和使用

    库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...

  5. GCC 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...

  6. 【转】gcc 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...

  7. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

  8. C# - *.dll vs *.lib (动态链接库 vs 静态链接库)

    静态库 库(Library)就是一段编译好的二进制代码,加上头文件就可以使用. 静态链接库(Windows 下的*.lib, Linux & Mac 下的 .a).之所以叫做静态,是因为静态库 ...

  9. 利用GCC编译器生成动态链接库和静态链接库

    转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码. ...

随机推荐

  1. 关于GSM基站定位

    一、基站定位两个参数 1、什么是LAC:Location Area Code(LAC)地区区域码,用来划分区域 2、什么是CellID:Cell Tower ID(Cid)CellID代表一个移动基站 ...

  2. 5、Linux下面桌面的安装

    搭建本地yum仓库的方法 http://www.cnblogs.com/lql123/p/5952788.html 1.yum grouplist        (列出yum仓库里的软件组列表) .y ...

  3. Ztree使用笔记

    在项目中需要用到树,使用了Ztree.(官网地址:http://www.treejs.cn/v3/main.php#_zTreeInfo,介绍很详细,有API,有demo) 1.初始化树:   $.f ...

  4. wireshark使用方法(学习笔记一)

    wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必须了解网络协议,否则就看不懂wireshark了. 为了安全考虑 ...

  5. 安装生物信息学软件-Samtools

    装完Bowtie2,官方文档给出的栗子说可以玩一玩samtools,所以我入个坑 参考这篇http://m.010lm.com/roll/2016/0620/2343389.html Step 1: ...

  6. hdu 2093

    ps:这题的输入我看到括号以为要用字符串,谁知道看了大神的才知道可以这样"scanf("%d(%d)",&a,&b);"  觉得好神奇.. 然后 ...

  7. Linux的awk命令

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  8. 原生javascript加载运行

    原生javascript加载运行 (function(){ //TODO sometings }()); 在要运行相应代码的位置加入script标签,创建函数并自执行; 关于window.onload ...

  9. TCP/IP 协议:IP 协议

    首先来看一下IP协议在实际中的位置: 我们只关系流程,不关系当前具体的服务类型 1.IP协议概述 作用: 从上图或从应用层->运输层->网络层->链路层来看,IP协议属于网络层,也就 ...

  10. HTTP请求 GET POST 网络编程实现(转)

    尊重原作者收集的资料,复制粘贴只为了避免作者文章出处哪天抽风了访问不了了导致资料消失. 原文地址 http://bbs.neworigin.net/forum.php?mod=viewthread&a ...