最近在弄摄像头,发现我在调用摄像头自带的函数的时候,库没连接上,于是经过高人指点,学习了一下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文件同目录下即可。

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

lib静态链接库,dll动态链接库,h文件的更多相关文章

  1. linux下静态链接库和动态链接库

    关于链接库的知识,网上太多资料了,但是并不代表我很熟悉.今天遇到了 一个问题,就是由于静态链接库和ubuntu系统不兼容导致的,虽然花了点时间才搞定 但是,其中暴露的问题也不少. 没有区分好静态链接库 ...

  2. (C#)WPF:.h(头文件)、.lib(静态链接库文件)和.dll(动态链接库文件)之间的区别与联系

    静态链接库(Lib)与动态链接库(DLL)的区别 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件:动态链接就是把调用的函数所在文件模块(DLL)和 ...

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

    目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库” ...

  4. vc下的静态链接库与动态链接库(一)

    一.静态库与动态库的区别 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Lib ...

  5. [拾零]C/C++_代码复用的实现_静态链接库_动态链接库_使用.def导出

    1 静态链接库 1.1 创建静态链接库: 1.在VC6中创建项目:Win32 Static Library 2.在项目中创建两个文件:xxx.h 和 xxx.cpp 3.编译 1.2 使用静态链接库 ...

  6. 介绍静态链接库和动态链接库的差别,及在VC++6.0中的建立和使用

    首先介绍一下链接库:链接库分为动态链接库和静态链接库两种 LIB是静态链接库,在程序编译连接的时候是静态链接,其相应的文件格式是.lib. 即当程序採用静态链接库的时候..lib文件里的函数被链接到终 ...

  7. linux c静态链接库与动态链接库

    库函数是我们编程的时候经常用到的,我们协作编程的时候可以将常用的函数封装成库供大家使用,这样能够提高大家的工作效率.对于库函数,它分为动态链接库和静态链接库.对于静态链接库我们必须是连接到可执行文件中 ...

  8. Linux环境下c语言静态链接库和动态链接库创建和使用

    库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...

  9. linux静态链接库与动态链接库详解

    一顺便说说了哦  通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(e ...

随机推荐

  1. SVN操作手册

    目 录 第1章 简介    1 第2章 SVN服务端    2 2.1 安装VisualSVN    2 2.2 VisualSVN服务    3 2.3 版本库    4 2.3.1 创建版本库   ...

  2. 抓包工具Fidder设置(移动端抓包)

    1.下载安装fiddler,下载链接:http://fiddler2.com/get-fiddler(我用的是免安装的fiddler2) 2.设置fiddler 打开Fiddler,     Tool ...

  3. NOIP 2014 普及组 T4 子矩阵

    [题意] 已知:n,m,r,c,a[i][j] (1 ≤ n ≤ 16, 1 ≤ m ≤ 16,1 ≤ a[i][j] ≤1000,1 ≤ r ≤ n, 1 ≤ c ≤ m) 条件:矩阵的分值定义为每 ...

  4. Computer assembly and maintenance

    转载请注明出处: 我所遇见的世界会更美好 第一章 计算机的基本构成和组装 1,内存的组成? (1)  RAM(随机存取存储器) (2)  ROM(只读存储器) (3)  Cache(高速缓存) 2,S ...

  5. python 练习 1

    from math import sqrt from datetime import date def k1(): #某人是1999年9月29日生日 #问到2006年9月29日他活了多少天 a=dat ...

  6. robotframework笔记22

    创建测试库 支持的编程语言 机器人框架本身是用写的 Python 和自然的测试 库扩展它可以使用相同的实现 语言. 运行时框架上 Jython ,图书馆也可以 实现使用 Java . 纯Python代 ...

  7. [redis] 普通 RedisPool 的 CRUD 实现

    参考链接: redisTemplate 操作 Maven中Spring-Data-Redis存储对象(redisTemplate) 1.配置RedisTempate类 配置文件 <?xml ve ...

  8. BluetoothGatt API

    punlic final class BluetoothGatt继承自Object , 实现了BluetoothProfile接口/** 相关的蓝牙协议可http://www.cnki.net/KCM ...

  9. 修改Window的hosts文件提示“该文件被其他程序占用”解决方案

    1.打开C:\Windows\System32\drivers\etc中的hosts 2.右键——>属性——>安全 3.在修改保存就可以了

  10. Java 之 I/O 系列 01 ——基础

    Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 整理<疯狂j ...