lib库dll库的使用方法与关系

一、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 }

 1 //mydll1.h
 2
 3 #ifndef MYDLL_H_H
 4 #define MYDLL_H_H
 5
 6 extern "C" __declspec(dllexport) void display(void);
 7 extern "C" __declspec(dllexport) void display1(void);
 8                                  void display2(void);
 9
10 #endif

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

  mydll1.h头文件中的:

  

1 extern "C" __declspec(dllexport) void display(void);

  这里的extern "C" 表示我们要按照C语言的方式编译该函数,防止在C++工程中编译出现函数名错误,因为C中没有重载而C++中允许重载,所以C++中函数编译后会出现[email protected]的形式;让编译器以C语言的编译方式编译可以保证C可以调用C++的动态链接库。__declspec(dllexport)表示下来的函数是dll的导出函数接口。没有导出的接口是不可使用的,这里和静态lib库有所区别,静态lib库中的所有函数、宏定义等都是可以使用的。

  2.使用def文件,该文件的功能类似于__declspec(dllexport)的功能。

  在资源文件目下添加def文件:

  

LIBRARY
EXPORTS
    display
    display1

  dll的调用:

  1.dll的显示调用:前提是我们必须知道函数名、返回值、参数列表。此时不需要相应的头文件,也不需要lib文件。只需要对应的dll就可以了。

  

 1 // test_my_dll.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include "windows.h"
 6
 7
 8 int _tmain(int argc, _TCHAR* argv[])
 9 {
10     HINSTANCE hInstance = LoadLibrary("mydll1.dll");
11     typedef void(*_print)(void);
12     _print printFun;
13     if(hInstance != NULL)
14     {
15         printFun = (_print)GetProcAddress(hInstance,"display1");
16     }
17     printFun();
18     FreeLibrary(hInstance);
19     system("pause");
20     return 0;
21 }

  这种情况下:HINSTANCE hInstance = LoadLibrary("mydll1.dll");会出现”2 IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容 “问题。解决办法:工程--->属性--->常规-->字符集--->使用多字节字符集就可以了。

  2.dll的隐式调用

   这是相应的lib库就派上用场了,其用法static library用法一致。

总结:显示调用和隐式调用这两种方法各有千秋,显示调用优点是只要接口参数列表没有发生改变,修改了函数实现的细节也没关系,所调用的exe程序不用重新编译只需替换新版的dll就可以。在大的项目中只用比较方便,但调用过程相对复杂需要使用一系列的windows函数还有函数指针等。对于隐式调用和static library用法一致比较容易理解,缺点是只要修改了任意内容相应的exe都需要重新编译。

参考资料:

    http://www.cppfans.org/1394.html

    http://blog.csdn.net/qq419036154/article/details/6438539

    http://blog.csdn.net/tianhen791/article/details/7209740

时间: 2024-10-11 07:49:10

lib库dll库的使用方法与关系的相关文章

动态链接库dll,导入库lib,静态链接库lib

目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”).  静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起.比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子.  动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己Load

vc下DLL项目设置dll和lib库输出路径以及使用lib/dll库时的包含路径

include 头文件包含路径设置: project->setting->C/C++->常规: Additional include directories(附加包含目录): ../../include等等 链接文件输出目录:    project->setting->配置属性->常规:输出目录 例如:输出目录:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName) 解释:项目目录-Temp-Link-工程

【摘自网络】dll库和lib库有什么区别

简单地讲:第一:.DLL是动态链接库,而.LIB是静态链接库dll是个编译好的程序,调用时可以直接调用其中的函数,不参加工程的编译. 而lib应该说是一个程序集, 只是把一些相应的函数总结在一起, 如果调用lib中的函数,在工程编译时,这些调用的函数都将参加编译.第二:从内存管理的角度来看,lib必须被链接到主程序中,主程序进入内存,lib也同时进入内存.而dll则是需要用到它的时候由操作系统调入内存.从复用性的角度来看,lib因为必须参加编译,所以复用性就不如DLL啦

MFC的亚博静态库.lib、体育动态库.dll以及Unicode库示例

MFC亚博静态库使用下列体育命名约定: uAFXcWd.LIB . 库命名约定的说明符如下: 说明符 值和含义u (n) ANSI 或 (u)Unicodec 创建的计划类型:c=alld d=debug版本; release版本略去说明符默认值为生成用于 Intel 平台的调试版本 windows ANSI 应用程序的静态库:NAFXCWD.Lib. 下表列出的所有库是在 \ atlmfc \ lib 目录中包含预生成的静态库. 静态链接库命名约定: 库 说明NAFXCW.LIB MFC 静态

链接库DLL的概念,加载方式的区别

使用LR进行基于windows socket协议做接口测试,只提供了lr_load_dll方法来动态加载动态链接库.之前学习阶段,对TinyXML的学习,使用的静态链接库,当时在程序调用的时候方法也跟LR里的不一样,那问题来了:lib和dll的区别是什么,每种链接库有多少种加载方式,怎么加载呢. 链接库可以向应用程序提供一些函数,变量和类.动态链接库的动态调用(也叫显式调用,手工加载)我是可以运用了,但是静态调用(也叫隐式调用,自动加载).静态链接库:lib中的函数不仅被连接,全部实现都被直接包

c# 使用ZXing.dll库生成二维码

最近工作中有需要一个需求,就是把一个服务地址生成二维码,可以用来扫码分享,网上找了下方法也比较多,我这里po一下调用ZXing.dll库生成二维码的方法吧.先简单介绍一下 ZXing库,ZXing库是一个开源Java类库,可用于生成和解析多种格式的1D/2D条形码:zxing遵循Apache License 2.0,只是工具而已,是不收费哒. ZXing库的下载地址:http://zxingnet.codeplex.com/ 点击下载,下载后解压压缩包: 把Zxing加到工程应用中,以下为核心代

基于Qt的动态库*.dll文件创建

有时候在做项目的时候我们需要将自己编写的类封装起来,Qt提供了一个很好的封装途径.下面将详细讲述一个简单的库的制作过程,最后再创建另外一个工程,在这个工程里面对封装的库进行调用,从而完成一个dll库从创建到调用的过程.谢谢大家指正! 第一步:先制作一个库文件. 1.首先新建一个工程,工程选项如下,我们要创建一个基于qmake的C++共享库. 2.选择库的类型和存放路径. 3.在"hellolib.cpp"中添加如下的代码,让库函数输出一行文字. 4.点击左下角的编译,如果没有错误就生成

Visual Studio 进行Excel相关开发,Microsoft.Office.Interop.Excel.dll库

1. Interop.Excel.dll 的查找 本文中将 Microsoft.Office.Interop.Excel.dll库简称为Interop.Excel.dll库 其实在使用Visual Studio进行Office的Excel开发时,Microsoft.Office.Interop.Excel.dll 可以在类似于下面的目录中找到.并不需要再在网上下载了. E:\Program Files\Microsoft Visual Studio 11.0\Visual Studio Tool

不容忽视的警告:默认库msvcrt.lib与其他库的使用冲突,请使用/NODEFAULTLIB:library

用Visual Studio编译C++项目的时候可能会遇到这个警告:默认库msvcrt.lib与其他库的使用冲突,请使用/NODEFAULTLIB:library. 不要因为是警告就可以不管了,这个问题不解决会给你带来无穷无尽的痛苦. 之所以VS会爆出警告,是因为VS在编译链接的时候发现既链接了msvcrtd.lib又要去链接msvcrt.lib.这种情况往往是因为你引用了地方三库.VS抱怨了而你没有关心,程序虽然编完了,但是一运行就出错,这时再去解决问题就麻烦了,你甚至不知道错在哪里. 还是老