静态库动态库链接分析

本文为验证后的结果,准确性较高,适合任何人阅读

静态库和动态库链接分析

1、文件组成结构

静态库:lib   头文件

动态库:lib   dll  头文件

从组成上看,动态库和静态库的差异在于动态库多了一份dll文件,导致动态库可以独立存在,

2、链接方式

静态库:只能静态链接

动态库:动态链接和静态链接

3、运行效果

静态库:相当于直接把代码段写入到exe或dll文件中

动态库:相当于与exe或dll形成了一种关系,exe或dll可以到动态库中去查找所需要的函数


4、差别:

静态库:不需要导出就可以被链接使用

动态库:需要导出后方可使用(动态链接)


5、编译

静态库:编译后只有lib文件

动态库:若没有导出函数刚只能编译出dll文件而没有lib因此无法静态链接


6、导出类的链接

静态库:不需要导出,可以直接链接

动态库:必需要导出才可以链接,必须将类中所有函数导出才可以使用(对于public)

对于(protected)无论导出或者不导出均无法直接使用

对于(private)无论导出或者不导出均无法直接使用


7、导出子类

静态库:不需要导出,直接使用文件头就可以使用

动态库:必须导出子类,

  若仅使用到子类函数,可以不用导出父类。

若需要使用到父类中继承的函数时,需要将父类中相应的函数导出,否则无法使用

私有函数成员无法在外部使用

若类不导出,只导出成员函数,同样可以正常使用,


小结,对于需要导出类时,建议使用静态库的方式,这样代码可以直接使用。


8、对于编译链接

静态库和动态库相同,若库中引用了很多外部库,且放在预编译头文件中,那么,在链接时可能无法找到某些库,此时需要在专用的导入库中增加,否则将链接失败,

例如:在stdafx.h中加入了#include<vector>using std::vector;

在链接时将无法使用,因此需要增加专用的头文件,以便可以正常链接。


9、存在这样一种情况,在动态库中,若使用def文件将类导出,在引用时还需要增加__declspec(dllimport)吗?

#pragma once
#ifdef _DLL_EXPLORT_

#define DLLEXPLORT _declspec(dllexport)
#else

#define DLLEXPLORT _declspec(dllimport)

#endif

DLLEXPLORT class  CTest1
{
public:
	DLLEXPLORT void A(void);
	DLLEXPLORT CTest1(void);
public:
	DLLEXPLORT ~CTest1(void);
protected:
	void B(void);
private:
	void C(void);
};

#include "StdAfx.h"
#include "Test1.h"

DLLEXPLORT CTest1::CTest1(void)
{
}

DLLEXPLORT CTest1::~CTest1(void)
{
}
DLLEXPLORT void CTest1::A()
{
	MessageBox(NULL,"ss","ss",MB_OK);
	B();
	C();
}

_declspec(dllexport) void A()
{
	MessageBox(NULL,"aa","aa",MB_OK);
}
void CTest1::B(void)
{
	MessageBox(NULL,"bb","bb",MB_OK);
}
void  CTest1::C(void)
{
	MessageBox(NULL,"cc","cc",MB_OK);

}

#pragma comment(lib,"Linklib.lib")
#include "../../Linklib/Linklib/Test1.h"

CTest1 ss;
	ss.A();


小结:

最终效果为程序均能够正常运行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值