一、lib库

  lib库有两种:一种是静态lib(static Lib),也就是最常见的lib库,在编译时直接将代码加入程序当中。静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是cpp文件编译生成的。

        另一种lib包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供。也就是平时编写dll时附带产生的lib,其中Lib只是Dll的附带品,是DLL导出的函数列表文件而已。

  共同点:两者都是二进制文件,都是在链接时调用,使用static lib的exe可以直接运行,使用另一种lib的exe需要对应的dll才能运行。

  静态lib库的创建示例:

  1.VS2005(包含)以上的版本

  2.建立win32控制台工程

  3.下一步选择static library

  4.完成

  代码:

 1 //mylib.h
 2 #ifndef MYLIB_H_H
 3 #define MYLIB_H_H
 4 #include "stdafx.h"
 5 
 6 void display();
 7 void display1();
 8 void display2();
 9 
10 #define A(x)  (x)*(x)
11 
12 #endif

  

 1 //mylib.cpp
 2 #include "stdafx.h"
 3 #include "mylib.h"
 4 
 5 void display()
 6 {
 7     cout<<"This is display"<<endl;
 8 }
 9 
10 void display1()
11 {
12     cout<<"This is display1"<<endl;
13 }
14 
15 void display2()
16 {
17     cout<<"This is display2"<<endl;
18 }

编译之后生成一个mylib.lib的库文件,引用库文件如下:

   右击工程-->属性(alt+F7)-->C/C++-->附加包含目录--->包含所需要的头文件。

   右击工程-->属性(alt+F7)-->链接器-->常规--->附加目录--->包含lib库所在的目录

   右击工程-->属性(alt+F7)-->输入--->附加依赖项--->lib库名

这样就能引用该lib内的函数了

  

 1 #include "stdafx.h"
 2 #include "mylib.h"
 3 
 4 int _tmain(int argc, _TCHAR* argv[])
 5 {
 6     display();
 7     display1();
 8     display2();
 9     cout<<A(6-2)<<endl;
10     getchar();
11     return 0;
12 }

当然,还可以使用#pragma comment(lib, "LibPath")的方法来调用Lib文件,同时必须包含相应的头文件。

  另一种lib库的使用方法:用法静态库一致,唯一不同的区别是运行时要加上相应的dll。

  DLL的用法:

  dll其实和exe是几乎完全一样的,唯一的不一样就是Exe的入口函数式WinMain函数(控制台程序是main函数),而Dll是DllMain函数,其他完全是一样的。所以有人也戏称dll是不能自己运行的exe。dll的创建也比较简单唯一麻烦的就是要定义导出函数接口。

  dll的创建过程:

  建立win32控制台工程,在应用程序设置的步骤,选择”动态库 Dynamic Library”,完成即可。(这里只是针对最简单的Dll,Win32 Application的方式稍有不同)

  定义导出函数接口的方法有两种:

  1.使用__declspce宏

  

 1 // dllmain.cpp : 定义 DLL 应用程序的入口点。
 2 #include "stdafx.h"
 3 
 4 BOOL APIENTRY DllMain( HMODULE hModule,
 5                        DWORD  ul_reason_for_call,
 6                        LPVOID lpReserved
 7                      )
 8 {
 9     switch (ul_reason_for_call)
10     {
11     case DLL_PROCESS_ATTACH:
12     case DLL_THREAD_ATTACH:
13     case DLL_THREAD_DETACH:
14     case DLL_PROCESS_DETACH:
15         break;
16     }
17     return TRUE;
18 }
View Code

相关文章: