静态链接库与动态链接库总结

最近在研究静态链接库与动态链接库,发现这里面有一些需要注意的细节方面,现总结如下:

静态链接库:

1:在生成lib文件的时候并不发生连接的过程,编译器仅仅把obj文件装载为一个lib文件。

例如:static1:int add(int a,int b){return a+b);} int sub(int a, int b){return a-b;}

static2: int myadd(int a, int b){return add(a,b);} int mysub(int a, int b){return sub(a,b);}

这个时候在static2工程中无论是否指定static1,编译都会通过的,只要在static2中声明add和sub,而且在静态链接库工程中project-setting 没有出现link这个选项,所以可以断定是不经过链接的。

2:在发布可执行文件的时候是不需要发布lib文件的,但是在发布静态库文件的时候要把依附于该静态库的其他静态库一起发布,这个被许多人忽视。

3:静态链接库工程中不需要指定导出函数,而动态链接库需要指定,否则的话不导出,属于内部函数。

动态链接库

1:动态连接库的头文件以及cpp文件的格式:

头文件的写法如下:

#ifndef MY_DLL1_HPP
#define MY_DLL1_HPP
///防止头文件被重复包含

#ifdef __cplusplus
extern "C" {
#endif
// 如果是c++编译器,就采用c连接方式

#ifdef DLL_API
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
DLL_API int my_add(int, int);
#ifdef __cplusplus
}
#endif

#endif

cpp文件的写法:

#define DLL_API
#include "my_dll1.hpp"
int addnum(int, int);
int my_add(int a, int b)
{
return addnum(a,b);
}

这种写法比较方便管理,而且比较省事。

2:在发布dll和lib文件的时候不需要指定依附于该动态链接库的静态链接库,但是在发布可执行文件的时候是需要发布该dll文件,这和静态链接库是不同的。

3:在使用extern"c"的时候,是不能进行函数的重载的,因为c编译器不支持函数重载。

4:导出某个类,在class后面和类名之间加入_declspec(dllexport)可以导出整个类,或者在类的成员函数名直接加入可以导出部分函数。

出处:http://blog.csdn.net/momentt/archive/2008/12/28/3629043.aspx