lib是静态库还是动态库,调用静态库lib
在一些项目中,考虑到系统的安全性和稳定性,往往需要封装一些DLL或LIB库供他人使用,那么如何制作DLL或LIB文件呢?今天天气真凉爽。我根据自己的实际情况来讲解一下基本的制作方法。
以下是我自己操作的记录:
1、动态库dll的编写方法:
创建新的动态链接库:
填写项目名称以选择项目类型。如果没有特殊要求,选择一个空项目。
您将在这里看到,与标准控制台项目一样,默认情况下没有创建任何文件。
我们需要在下面添加一些文件。
要构建一个动态库dll文件,我们不需要写main函数。我们只需要实现我们需要一个一个实现的接口函数。我们需要在这里使用它们
解释ext c _ _ declspec(dll导出)。您可以通过将extern C __declspec(dllexport)添加到声明中来导出函数。
例如:
新建function.h,function.cpp
函数. h
#ifndef __FUNCTION_H__
#定义__函数_H__
#包含afx.h
#includeinclude.h
//3DES加密函数. 24字节密钥(导出函数)
extern C _ _ declspec(dll export)HANDLE Open();
#endif
并且可以用function.cpp编写
extern C __declspec(dllexport)句柄打开()
{
HANDLE dev HANDLE=INVALID _ HANDLE _ VALUE;
dev handle=open device();
返回DevHandle
}
编译后,您可以在debuf或release文件夹中看到dll文件。
使用dll文件也很简单:把生成的dll文件放在应用程序的项目目录下,我们还需要上一步的导出头文件。
#包含“AppTest.h”
//#pragma注释(lib, AppTest.lib )
HINSTANCE MyDll
处理Encryp
//打开dll文件
MyDll=LoadLibrary( apptest . dll );
if(MyDll==NULL)
{
退出(0);
}
typedef句柄(* DllFun)();//函数指针,注意原函数的原型。
DllFun MyFun
my fun=(DllFun)GetProcAddress(MyDll, Open );//获取这个函数的虚拟地址
if(MyFun==NULL)
{
AfxMessageBox(未能获取dll函数!);
退出(0);
}
encryp=my fun();//调用MyFUn实际上是调用dll中的OpenDog
if(Encryp==INVALID _ HANDLE _ VALUE)
{
退出(0);
}
静态库的建立和应用
创建新的静态库项目。
如果不关注任何选项,可以默认。完成后,项目中目前没有文档,需要我们自己添加。我们也不写主函数,只需要写功能函数的实现。然后在头文件中用extern修饰,编译。
例如,我们创建新的function.h和function.cpp文件。
函数. h
#ifndef __FUNCTION_H__
#定义__函数_H__
#包含afx.h
#includeinclude.h
外部句柄open dog();
#endif
函数. cpp
句柄OpenDog()
{
HANDLE dev HANDLE=INVALID _ HANDLE _ VALUE;
dev handle=open device();
返回DevHandle
}
这样,就可以编制了。
但是我在这里遇到了很多问题,编译时总是提示错误。这主要是由于一些名称空间的名称重复造成的。这种错误很麻烦。下面是我编译lib时的工程设置。
特别注意第二页中显示的被忽略的库。
lib静态库的使用:使用# pragma comment (lib, apptest.lib )后,直接调用静态库的函数即可。
#包含“AppTest.h”
#pragma注释(lib, AppTest.lib )
处理加密狗;
encryp dog=open dog();
if(encryptog==INVALID _ HANDLE _ VALUE)
{
退出(0);
}