静态链接库和动态链接库的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hhhuang1991/article/details/80056071

一、静态链接库的使用

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件。
在VS2015平台上,创建一个静态库(.lib)项目方案,选择【创建项目/Win32/Win32控制台应用程序/静态库(.lib)】,如下图所示,
这里写图片描述
生成项目后,创建两个项目文件staticdll.cpp和staticdll.h,并添加如下代码,

//staticdll.h
#pragma once
//提供给应用程序使用的add函数声明
//与动态链接库不一样,不需要__declspec(dllexport)前缀
extern "C" int add(int x, int y);

//staticdll.cpp
#include "stdafx.h"
#include "staticdll.h"
//提供给应用程序使用的add函数定义
int add(int x, int y)
{
    return x + y;
}

编译项目,得到对应的静态链接库文件staticdll.lib。
在测试项目中调用静态链接库,需要对应的头文件staticdll.h和对应的静态链接库文件staticdll.lib,调用函数如下,

#include "stdafx.h"
#include <iostream>
using namespace std;
//静态库调用
//头文件和静态库文件路径必须要正确
#include "..\staticdll\staticdll.h"
#pragma comment(lib, "..\\Debug\\staticdll.lib")

int main()
{
    int x = 10;
    int y = 20;
    cout << "静态库函数调用:x + y = " << add(x, y) << endl;
    getchar();
    return 0;
}

二、动态链接库的使用

动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。
在VS2015平台上,创建一个DLL项目方案,选择【创建项目/Win32/Win32控制台应用程序/DLL】。
生成项目后,创建两个项目文件dynamic.cpp和dynamic.h,并添加如下代码,

//dynamic.h
#pragma once
#ifdef DYNAMIC_H_
#define dynamicexport extern "C" __declspec(dllexport)
#else
#define dynamicexport extern "C" __declspec(dllimport)
#endif

dynamicexport int add_dll(int x, int y);

//dynamic.cpp
#define DYNAMIC_H_
#include "dynamic.h"

int add_dll(int x, int y)
{
    return x + y;
}

编译项目,得到对应的动态链接库文件dynamic.dll和动态链接库对应的导入库文件dynamic.lib。
在测试项目中调用动态链接库,需要对应的头文件dynamic.h和对应的导入库文件dynamic.lib,同时还要将dynamic.dll文件与执行文件exe放在同一个目录下,调用如下,

#include "stdafx.h"
#include <iostream>
using namespace std;
//动态库静态调用
#include "..\dynamic\dynamic.h"
#pragma comment(lib, "..\\Debug\\dynamic.lib")

int main()
{
    int a = 5;
    int b = 10;
    cout << "动态库函数静态调用:a + b = " << add_dll(a, b) << endl;
    getchar();
    return 0;
}

静态库的调用和动态库的静态调用形式是一样的,动态库还可以采用动态调用,请参考博客:DLL基本应用

三、静态库和动态库的区别

1、 静态链接库的后缀名为lib,动态链接库的导入库的后缀名也为lib。不同的是,静态库中包含了函数的实际执行代码,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息;
2、由于静态库是在编译期间直接将代码合到可执行程序中,而动态库是在执行期时调用DLL中的函数体,所以执行速度比动态库要快一点;
3、 静态库链接生成的可执行文件体积较大,且包含相同的公共代码,造成内存浪费;
4、 使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;
5、 DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性,适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

猜你喜欢

转载自blog.csdn.net/hhhuang1991/article/details/80056071