VS2010下静态链接库和动态链接库的生成和使用

静态链接库VS动态链接库

静态链接库与动态链接库都是共享代码的方式。

静态链接库

  • 包含:头文件 .h 、静态库 .lib
  • .lib包含了实际执行代码、符号表等等。
  • .lib中的指令都全部被直接包含在最终生成的 EXE 文件中。
  • 静态链接库中不能再包含其他的动态链接库或者静态库。
  • 对函数库的链接是放在编译时期完成的。
  • 程序在运行时与函数库没有瓜葛,移植方便。
  • 浪费空间和资源。

动态链接库

  • 包含:头文件 .h 、导入库 .lib 、动态库 .dll
  • 其实际的执行代码位于.dll中,.lib只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
  • .dll不必被包含在最终exe文件中,exe文件执行时可以“动态”地引用和卸载这个与 exe独立的dll文件。
  • 动态链接库中还可以再包含其他的动态或静态链接。
  • 将库函数的链接载入推迟到程序运行时期。
  • 可以实现进程间的资源共享(因此也称为共享库)。
  • 将一些程序升级变得简单。
  • 可以真正的做到链接载入完全由程序员在程序代码中控制(显示调用)。

静态链接库的生成

关键点:配置类型 –> 静态库(.lib)

具体方法如下:

  • 新建一个工程
    这里写图片描述

  • 创建头文件:staticTest.h

int add(int a,int b);
  • 创建源文件:staticTest.cpp
#include "staticTest.h"
int  add(int a,int b){
    return a+b;  
}
  • 修改配置类型属性,注意编译时配置的属性(debug还是release,win32还是win64)决定生成的库文件是什么类型。
    这里写图片描述

  • 编译,生成的 myStaticLibTest.lib 库文件位于解决方案的debug或release文件夹中。

静态链接库的使用

调用方法一

  • 创建新项目,将库文件 myStaticLibTest.lib 和 staticTest.h 头文件copy到项目目录下(存放源文件的地方)
  • 创建源文件:testLib.cpp
#include "staticTest.h" //包含头文件 
#pragma comment(lib, "myStaticLibTest.lib") //连接库文件

#include<stdlib.h>
#include<stdio.h>
#define namespace std;
void main(int argc, char* argv[]){
    printf("a+b=%d\n",add(1,2));
    system("pause");
}

注意:myStaticLibTest.lib 和 staticTest.h也可以放到别的地方,只需要在程序中加上相对或绝对路径即可,如:”../myLib/myStaticLibTest.lib”(”.”指同级目录,”..”指上一级目录)

调用方法二

  • 创建新项目,将库文件 myStaticLibTest.lib 和 staticTest.h 头文件copy到”solution/mylib”(可随意指定)目录下。
  • 指定头文件所在目录:包含目录,库文件所在目录:库目录(可写相对或绝对路径)。
    这里写图片描述

  • 添加链接库:附加依赖项
    这里写图片描述

  • 创建源文件:testLib.cpp

#include "staticTest.h" //包含头文件 

#include<stdlib.h>
#include<stdio.h>
#define namespace std;
void main(int argc, char* argv[]){
    printf("a+b=%d\n",add(1,2));
    system("pause");
}

动态链接库的生成

关键点:配置类型 –> 动态库(.dll)

具体方法如下:

  • 新建一个工程:myDynamicLibTest
  • 创建头文件:dynamicTest.h
/***************
下面一段的作用是使"生成dll的项目"和"调用dll的项目"都可以使用同一个头文件:dynamicTest.h 。
__declspec(dllexport),生成dll的项目用于导出(函数 变量 类等)。
导出变量:        __declspec(dllexport) int a;
导出函数:        __declspec(dllexport) void a();
导出类 : class  __declspec(dllexport) a{};
__declspec(dllexport),调用dll的项目中用于导入(函数 变量 类等)。   
***************/
#ifdef DLL_EXPORTS
#define MYDLL_EXPORT __declspec(dllexport)
#else
#define MYDLL_EXPORT __declspec(dllimport)
#endif

MYDLL_EXPORT int add(int a,int b);//显示调用最好在前头加上extern “C” 变为C标准编译,可杜绝C++的重载
  • 创建源文件:dynamicTest.cpp
//DLL_EXPORT宏定义要位于包含dynamicTest.h之前,这个宏也可以在预处理器中添加,如下图。
#define DLL_EXPORTS 
#include "dynamicTest.h"

int add(int a,int b){
    return a+b;
}

这里写图片描述
- 修改配置类型属性,注意编译时配置的属性(debug还是release,win32还是win64)决定生成的库文件是什么类型。
这里写图片描述

  • 编译,生成的 myStaticLibTest.lib 和 myStaticLibTest.dll 文件位于解决方案的debug或release文件夹中。

动态链接库的使用

动态链接库的使用和静态链接库类似,唯一不同的是需要将myStaticLibTest.dll文件和项目编译生成的执行文件:.exe文件放在一起,一般位于解决方案的debug或release文件夹中。

参考:

  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值