Windows 下动态链接库和静态链接库
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 下动态链接库和静态链接库的更多相关文章
- Linux下动态链接库和静态链接库
第一部分:编译过程 先了解一下linux下C代码的编译过程,C代码的编译,一般分成四个阶段,包括:预编译,编译,汇编和链接,这四个阶段的分工是 预处理过程,负责头文件展开,宏替换,条件编译的选择,删除 ...
- [转载]GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结
来自http://blog.csdn.net/benpaobagzb/article/details/51364005 GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有 ...
- Qt 共享库(动态链接库)和静态链接库的创建及调用
前言: 编译器 Qt Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sh ...
- Linux环境下c语言静态链接库和动态链接库创建和使用
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...
- GCC 编译使用动态链接库和静态链接库
1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...
- 【转】gcc 编译使用动态链接库和静态链接库
1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...
- GCC编译过程与动态链接库和静态链接库
1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...
- C# - *.dll vs *.lib (动态链接库 vs 静态链接库)
静态库 库(Library)就是一段编译好的二进制代码,加上头文件就可以使用. 静态链接库(Windows 下的*.lib, Linux & Mac 下的 .a).之所以叫做静态,是因为静态库 ...
- 利用GCC编译器生成动态链接库和静态链接库
转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码. ...
随机推荐
- [HB2014 Week5] Allot 人员分配
这两天决心专门搞好网络流了 - - 题解在什么瞎胡搞跟我说要连n+2和n+1容量为无穷的边…我看了下std才做的… 坑死人的地方就是,需要求多次网络流,每次别忘了把流给清空了…这次是用链表所以专门写了 ...
- mybatis sql in 查询
mybatis官方学习文档:http://www.mybatis.org/core/getting-started.html 本文转自:http://www.blogjava.net/xmatthew ...
- Psp个人软件开发软件需求分析及用例分析
一.需求分析 1. 业务需求 1.1 应用背景 开发项目进度计划总是那么不明确,延期经常出现,甚至无法给出一个相对比较明确的延迟时间.这样给市场的推广会带来很大的影响,不确定因素使得应对十分困难. ...
- HM NIS Edit 2.0.3 Win32 Error. Code:740.请求的操作需要提升
使用NSIS安装向导,生成脚本后,按F9后,居然提示:HM NIS Edit 2.0.3 Win32 Error. Code:740.请求的操作需要提升 一开始就出错了,还真不顺. 在网上搜索了一下, ...
- CSS行内元素和块级元素的居中
一.水平居中 行内元素和块级元素不同,对于行内元素,只需在父元素中设置text-align=center即可; 对于块级元素有以下几种居中方式: 1.将元素放置在table中,再将table的marg ...
- 更新包地址安装新版node.js
# apt-get update # apt-get install -y python-software-properties software-properties-common # add-ap ...
- BackTrack5-r3硬盘安装
用Universal-USB-Installer-1.9.4.2这个工具,选择系统类型为Backtrack5 R3,选择Backtrack5 R3系统的ISO文件,然后选中U盘盘符,点击”Create ...
- 100个直接可以拿来用的JavaScript实用功能代码片段
目录如下: 1.原生JavaScript实现字符串长度截取2.原生JavaScript获取域名主机3.原生JavaScript清除空格4.原生JavaScript替换全部5.原生JavaScript转 ...
- VMD_EI_API=>MAINTAIN_BAPI 去创建供应商主数据
转自 http://blog.sina.com.cn/s/blog_9ae2f2940102uxyp.html VMD_EI_API=>MAINTAIN_BAPI 去创建供应商主数据的部分数据代 ...
- 有100个节点的AVL树最大深度是多少?
首先说AVL树的概念 1 左右子树的深度差<=1 2 左右子树都是AVL树. 其实这样算,可以倒推的. 空树 DEPTH = 0; AVL_DEPTH = 2^0+2^1+......+2^k ...