当前位置: 编程技术>c/c++/嵌入式
链接库动态链接库详细介绍
来源: 互联网 发布时间:2014-10-11
本文导语: windows中,链接库分为两种类型:静态链接库.lib和动态链接库.dll。其中动态链接库在被使用的时候,通常还提供一个.lib,称为引入库,它主要提供被Dll导出的函数和符号名称,使得链接的时候能够找到dll中对应的函数映射。 ...
windows中,链接库分为两种类型:静态链接库.lib和动态链接库.dll。其中动态链接库在被使用的时候,通常还提供一个.lib,称为引入库,它主要提供被Dll导出的函数和符号名称,使得链接的时候能够找到dll中对应的函数映射。
静态链接库和动态链接库的作用相似,都是提供给其他程序进行调用的资源。其中,动态链接库的调用方法分隐式调用(静态导入调用)和显示调用(动态导入调用)。
编译环境:
Microsoft Visual Stdio 2010
--------------------------------------------------------------------------------
DLL导出符号
例,首先生成一个dll1.dll和dll1.lib
// DLL1工程,dll1.cpp
// _declspec(dllexport)为导出符号
_declspec(dllexport) int add(int a, int b)
{
return a + b;
}
利用微软的depends工具查看dll1.dll,导出的符号如下:
其中各字段意义:Ordinal(符号序号,后面使用GetProcAddress的时候,参考的数值),Hint(这个我也不是太明白,据说是不用了解),Function(这个就是函数导出后的符号名称了),EntryPoint(这个是函数在DLL中的地址)。
这里之所以函数的名称变成了这样子,是因为使用的编译器默认使用C++方式进行编译,由于C++支持重载,那么需要给函数名增加额外的符号,来使与同名的重载函数区分开来,才能在DLL中通过符号名来进行定位。
这里可以做个简单的测试,新建控制台测试工程DllTest如下。
// DllTest工程,DllTest.cpp
#include
using namespace std;
int main(void)
{
// extern int add(int a, int b);
// _declspec(dllimport)是导入声明,这种方式比上面的方式更有效,同时编译器能边编译出更加高效的代码。
_declspec(dllimport) int add(int a, int b);
cout
静态库,动态库,静态链接和动态链接
.a文件的动态链接和静态链接问题
linux动态链接库里全局变量和静态变量会导致动态库不可重入吗?
动态库链接 变为 静态库链接问题
gdb调试动态链接库
请教关于动态链接库的问题
动态链接库转换?
编译时如何区分动态链接和静态链接?
linux下链接一个动态库后原有程序不能正常运行
关于动态链接库,翻译一段文字
linux下动态链接库函数找不到
问一个编译动态链接库的问题
so动态链接库的问题
linux能否使用*.DLL型动态链接库
请教linux9。0中使用动态链接库的问题
多线程中动态链接库的使用
Linux动态链接的疑惑
Linux下的关于动态链接库
动态链接库路径如何设置?
静态链接库和动态链接库的作用相似,都是提供给其他程序进行调用的资源。其中,动态链接库的调用方法分隐式调用(静态导入调用)和显示调用(动态导入调用)。
编译环境:
Microsoft Visual Stdio 2010
--------------------------------------------------------------------------------
DLL导出符号
例,首先生成一个dll1.dll和dll1.lib
代码如下:
// DLL1工程,dll1.cpp
// _declspec(dllexport)为导出符号
_declspec(dllexport) int add(int a, int b)
{
return a + b;
}
利用微软的depends工具查看dll1.dll,导出的符号如下:
其中各字段意义:Ordinal(符号序号,后面使用GetProcAddress的时候,参考的数值),Hint(这个我也不是太明白,据说是不用了解),Function(这个就是函数导出后的符号名称了),EntryPoint(这个是函数在DLL中的地址)。
这里之所以函数的名称变成了这样子,是因为使用的编译器默认使用C++方式进行编译,由于C++支持重载,那么需要给函数名增加额外的符号,来使与同名的重载函数区分开来,才能在DLL中通过符号名来进行定位。
这里可以做个简单的测试,新建控制台测试工程DllTest如下。
代码如下:
// DllTest工程,DllTest.cpp
#include
using namespace std;
int main(void)
{
// extern int add(int a, int b);
// _declspec(dllimport)是导入声明,这种方式比上面的方式更有效,同时编译器能边编译出更加高效的代码。
_declspec(dllimport) int add(int a, int b);
cout