首先,静态库和动态库的全称为静态链接库和动态链接库。顾名思义,静态库和动态库都是作用于编译过程的链接阶段(编译过程分为预编译、编译、汇编和链接)。
库是一种可执行代码的二进制文件。它是一种可复用的代码,在现实的编程中,每个程序都依靠底层的库。静态库的后缀为(.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;
}