lib静态链接库,dll动态链接库,h文件

时间:2022-02-20 08:26:44

最近在弄摄像头,发现我在调用摄像头自带的函数的时候,库没连接上,于是经过高人指点,学习了一下lib静态链接库,dll动态链接库来补充一下自己的基础知识。

一、首先我们来介绍一下lib静态链接库。

  lib静态链接库是在编译时要用到,如果只需要编译源代码的话只要有.lib文件就好了。下面主要讲一下在vs2010中如何使用自己建立的.lib文件,以及如何使用lib文件。

  1、建立lib文件:首先在vs当中先建一个工程文件,然后单击下一步,选择lib静态链接库,紧接着就是建立自己的.h文件了,在h文件当中主要声明数据,函数,或者类,然后再.cpp源文件中实现相应的函数或者类。这是生成lib文件的过程。

  2、调用生成的lib文件:在上面已经生成lib文件之后,就是如何调用这个文件了,记得我在学习opencv的时候调用opencv的库文件的情形,发现这个跟那个其实是一样一样的。主要就是添加两个文件:h文件和lib文件。

主要分三步:

第一步是包含头文件的路径:在项目工程属性中VC++目录下的包含目录中包含刚开始建立的lib文件的头文件(h文件)的路径。

第二步是包含所建的静态链接库的文件所在的路径(这里的路径是你把生成的lib文件拷贝到所在的路径):在项目工程属性中VC++目录下的库目录包含刚刚生成的lib文件的文件夹路径(这里的路径只是定位到这个库文件的文件夹)。

第三步是在项目工程属性中的连接器下的输入项中的附加依赖项中输入刚刚生成的lib文件的名称(包括后缀名)。就这样子可以实现调用自己建立的库函数了。

在第三步当中其实也可以在程序中用#pragma comment(lib,"...\\testlib.lib")语句代替。

好了,接下来就是介绍dll动态链接库了。

这样子就实现了生成静态库了,以及调用静态库了。

  二、动态链接库是在运行时需要用到。动态链接库包括两个文件:dll文件和lib文件。当然h文件也是不能少的。下面介绍如何生成dll文件和lib文件(这个lib文件跟上面的静态文件是不一样的。这个lib文件只包含数据,函数,类的声明部分,并没有包含实现部分。而上面的静态链接库包含了声明和实现部分。)  

跟静态链接库一样,首先要建立自己的动态链接库文件。

  1、生成dll文件和lib文件(此处有点复杂):首先同样新建一个项目工程文件,单击下一步,选择dll动态链接库,然后就是建立h文件,这里的h文件中的代码可以参考:

#ifndef TestDll_H_
#define TestDll_H_
#ifdef  dll       //这是动态文件的名称
#define dll extern "C" _declspec(dllimport) ///为了更好的处理静态变量(当这句话省略的时候无法处理静态变量)
#else
#define dll extern "C" _declspec(dllexport) ///将文件名称导出到lib文件中
#endif
dll int Add(int plus1, int plus2);//这部分是定义相应的数据,函数,类的声明(这里需要注意的是声明部分是类的时候,类的关键字class是在动态文件名称的前面)。
//You can also write like this:
//extern "C" {
//_declspec(dllexport) int Add(int plus1, int plus2);
//};
#endif

,然后就是添加源文件(.cpp)。可以参考下面的程序:

#include "stdafx.h"
#include "testdll.h"
#include <iostream>
using namespace std;
int Add(int plus1, int plus2)   //这是函数,类的实现部分
{
int add_result = plus1 + plus2;
return add_result;
}

第三步最重要的是:首先单击项目工程文件,选择添加,在选择新建项,在选择模块定义文件(.def文件)。然后在.def文件中的代码至关重要(我在这里出错了)。代码如下:

LIBRARY "dll"//指明生成哪个dll文件,即知名生成的dll文件的名称。
EXPORTS
Add @1  //sample @1  这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样,按照编写的顺序来的,第一个函数就是1,第二个函数就是2,以此类推。

   2、调用上面生成的dll文件和lib文件(此处有点复杂):这个调用跟上面的静态函数的调用是一样的,也是需要包含头文件的目录,和库(上面跟dll文件一起生成的lib文件)文件的路径,最后是连接器中的添加附加项中输入库文件的名称(上面跟dll文件一起生成的lib文件的全称,包括后缀名)。增加一个操作把上面生成的dll文件拷贝到你需要用调用的exe文件同目录下即可。

这样子就实现了生成动态文件和调用动态文件了。