静态库与动态库详细剖析

        首先,静态库和动态库的全称为静态链接库和动态链接库。顾名思义,静态库和动态库都是作用于编译过程的链接阶段(编译过程分为预编译、编译、汇编和链接)。

        库是一种可执行代码的二进制文件。它是一种可复用的代码,在现实的编程中,每个程序都依靠底层的库。静态库的后缀为(.a和.lib),动态库的后缀为(.so和.dll)。


静态库:

        何为静态库。它是在链接过程中,与汇编生成的.o和.obj文件一起链接入可执行文件中,故静态链接库的格式和.b.obj文件格式相近。也因为它是在连接时,把整个库都链入可执行文件中,所有通过静态库生成的可执行文件大小偏大,并且每次修改静态链接库(.lib)时,都需要重新生成可执行文件。

静态库的特点:

1、静态库在对函数库的链接在编译时期就完成了。

2、可执行文件与函数库无关联,使移植方便。

3、因为,静态库和目标文件全部链入了可执行文件,占用空间浪费了资源。尤其是,生成多个可执行文件时。


动态库

        何为动态库。它在链接过程不会被链入可执行文件中,它是在程序运行的时候才被载入。通过只创建一份共享库的备份,实现多个应用程序共享一个共享库。从而改善了静态库浪费空间的缺点。但是,它也有不如静态库的地方,比如运行时的速度。它也可以软件更新时,只需要做到更新动态链接库即可完成更新。

动态库的特点:

1、动态库把对一些库函数的链接载入推迟到程序运行的时期。

l2、可以实现进程之间的资源共享。(因此动态库也称为共享库)

3、将一些程序升级变得简单。

4、甚至可以真正做到链接载入完全由程序员在程序代码中控制。


静态库的创建和使用:

        首先,我们需要创建一个.h文件和一个.cpp文件。在.h文件中申明函数和类等,在.cpp文件中,对.h文件中申明的方法进行实现。然后运行生成,即可在工程目录下找到生成的.lib文件。

        我是在VS2013中,使用.lib文件。方法有二:

方法1、直接使用#include"路径名/*.h"。因为,想要使用对应的函数,必须要有头文件的申明。

然后,在文件中添加#pragma comment"lib,*.lib"   表示引入对应的库文件,库文件里面是对应函数的具体实现。

方法2、在项目上,右键属性C/C++中常规中的附加包中添加入含有对应.h文件的文件夹。在链接器中的附加库文件目录中,添加含有对应.lib文件的文件夹。


动态库的创建和使用:

       首先,我们也是需要创建一个.h文件和一个.cpp文件。在.h文件中申明函数和类等,在.cpp文件中,对.h文件中申明的方法进行实现。然后运行生成,即可在工程目录下找到生成的.lib文件和.dll文件。在这里要注意,因为windows下使用动态库,需要导出具体的函数,这里要使用#define API_DECLARE __declspec(dllexport),然后在要导出的函数前加上API_DECLARE。其余,则和静态库一致。

推荐:DLLExportViewer-v1.36H工具,可以查看你导出的所有函数。

下面附上自己编写的小小静态库和动态库代码:

静态库:

//test.h
#pragma once

#include<stdio.h>

void test1();

class test
{
public:
	void test2();
};

//test.cpp
#include"test.h"

void test1()
{
	printf("this is a test1.\n");
}

void test::test2()
{
	printf("this is a test2.\n");
}

//main.cpp
#include"../静态库/test.h"

#ifdef WIN32
#pragma comment(lib,"../静态库/Debug/静态库.lib")
#endif

#include<iostream>
using namespace std;

int main()
{
	test1();
	test x;
	x.test2();
}

动态库:
//test.h
#pragma once

#include<stdio.h>

#if _WIN32
#define API_DECLARE __declspec(dllexport)
#else
#define API_DECLARE
#endif

void API_DECLARE test1();

class test
{
public:
	void API_DECLARE test2();
};
//test.cpp
#include"test.h"

void test1()
{
	printf("this is test1\n"); 
}

void test::test2()
{
	printf("this is test2\n");
}

//main.cpp
#include"../ConsoleApplication1/test.h"

#include<iostream>
using namespace std;

#pragma comment(lib,"../ConsoleApplication1/Debug/动态库.lib")

int main()
{
	test1();
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值