动态库基础知识
来源:互联网 发布:10年前让你做淘宝你说 编辑:程序博客网 时间:2024/05/12 04:44
1. 静态库的使用需要库的开发者提供.h和.lib文件,使用者需要把这两个文件拷贝到调用静态库的工程目录下。
2. 静态库的编译:先新建一个静态库工程,然后再新建一个.h和.cpp文件,对这两个文件进行编译就会生成.lib文件。
3. 静态库的使用需要特殊的方式:
eg #include <stdio.h>
#include " lib.h"
#pragma comment(lib," libTest.lib") //这句话的作用是链接时把.lib文件该工程中的.obj文件链接到一起
int main(int argc,char *argv[])
{
printf("2+3=",add(2,3));
}
4. 动态库的使用需要库的开发者提供.dll和.lib文件,或.dll文件。动态库.dll文件中包含导出函数:可以被应用程序所调用;内部函数:不能被应用程序所调用。所以动态库的使用比静态库多出了一点即需要特殊的声明。
5. 动态库的编译:新建一个动态工程,再新建一个.h文件
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x,int y); //__declspec(dllexport)的作用既特殊的声明add()为动态库中的导出函数。
#endif
新建一个.cpp文件
#include "lib.h"
int add(int x,int y)
{
return x+y;
}
编译就会生成.dll文件,将.dll文件拷贝到你的当前工作目录
动态库的动态调用:需要用到LoadLibrary—Dll加载函数,
GetProcAddress-Dll导出函数的地址获取,FreeLibrary-Dll卸载
eg #include <stdio.h>
#include <windows.h>
typedef int(*lpFunAdd)(int x,int y);//定义指向函数的指针
int main(int argc,char *argv[])
{
HINSTANCE hdll;定义一个句柄
hdll=LoadLibrary(”名称.dll”);
lpFunAdd addFun;//函数指针
if(hdll!=NULL)
{
addFun=(lpFunAdd)GetProcAddress(hdll,”add”);
if(addFun!=NULL)
{
int result=add(2,3);
printf(“%d”,result);
}
FreeLibrary(hdll);
}
return 0;
}
动态函数的静态调用: 使用更加广泛简单
#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"libtest2.lib")
extern "C" __declspec(dllimport)add(int x,int y);
int main(int argc,char *argv[])
{
int result=add(2,3);
printf("%d",result);
return 0;
}
动态函数的静态调用需要完成两步:1.告诉编译器与dll文件相对应的.lib文件所在位置,.lib文件中包含了.dll文件中的导出函数的文件名和序号,并不包含实际代码,在应用程序中代替.dll文件进行编译2.声明导入函数 extern "C" __declspec(dllimport)add(int x,int y);
.lib,.h,.dll文件的区别??
1. DllMain函数,windows在加载dll函数时需要一个入口函数,在之前的例子中没有用到是因为系统在找不到DllMain函数时会从其他库中引用一个不做任何操作的DllMain,并不意味着不需要DllMain函数。(默认从其他动态库中加载一个DllMain)该函数不属于导出函数,而是内部函数。
DllMain.cpp:
#include <stdio.h> //printf函数需要
#include <windows.h> // APIENTRY等需要
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD _ul_reason_for_call,
LPVOID lpReserved
)
{
switch(_ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("\nprcess attach of dll");
break;
case DLL_THREAD_ATTACH:
printf("\nthread attach of dll");
break;
case DLL_PROCESS_DETACH:
printf("\nprocess detach of dll");
break;
case DLL_THREAD_DETACH:
printf("\nthread detach of dll");
break;
}
return true;
}
编译
和"lib.cpp","lib.h"连接即可生成.dll和.lib文件,动态库的引用在和上面一样。
- 动态库基础知识
- Windows动态链接库基础知识
- DLL 动态链接库 基础知识
- 动态链接库DLL基础知识
- linux gcc 动态共享库基础知识
- linux gcc 动态共享库基础知识
- linux gcc 动态共享库基础知识
- 动态连接库(DLL)的基础知识
- C++基础知识 动态链接库和静态链接库
- 静态库lib和动态链接库dll的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- HttpClient模拟发送http请求
- servlet中的load-on-startup的含义
- SQL Server2005还原差异备份
- hdu(4021)八数码的解是否存在问题
- Java学习札记20:Java程序员集合框架面试题
- 动态库基础知识
- android设置图片填充样式
- websphere jfreechart中文字体显示问题
- i++ && ++i
- struts2中struts.properties配置文件详解(及在struts.xml文件中的配置)
- 基于Verilog HDL语言的32X8 FIFO设计
- MVC 3.0 学习
- android ViewPager动态加载问题
- C#操作数据库的常用公共方法!