关于lib、dll、h文件的关系小结,以及VS的配置小结

总括

记录学习到的一些基本的编程知识。。

参考链接:https://www.cnblogs.com/azbane/p/7364060.html(强烈推荐这个链接第一部分的内容)!!!
https://www.cnblogs.com/405845829qq/p/4108450.html
.lib文件分为动态链接库(dll)的导入库(简称“动态库”)和静态链接库(简称“静态库”)

静态库

.h文件声明了函数的接口,并指示编译器去.lib文件中寻找对应的函数入口,函数内容同时也写在了.lib文件中。
在编译为可执行文件时,.lib文件中的所有内容会被直接写入最终的程序中,程序会显得很大。

动态库(目前常用,opencv、pthread等都是这种方式)

.h文件声明了函数的接口,并指示编译器去.lib文件中寻找对应的函数入口,而.lib文件只是存放了函数的入口地址。(编译到此已经结束)执行程序时,程序才会根据函数的地址去寻找与.lib文件相链接的.dll动态链接库文件(存放了函数的内容)。

编译方式

在VS2019中,可以选择静态编译(MTd/MT)或动态编译(MDd/MD)(有d表示DEBUG)两种方式。一些基础的库可能可以两者都可编译,但OpenCV的release版本似乎只有动态编译方法(到其它的无OpenCV电脑上就会提示缺失dll文件),想要静态编译,具体的步骤可以参考这个链接(还没试过):https://wenku.baidu.com/view/ef3081e3a5e9856a561260d1.html

https://blog.csdn.net/qq_15036691/article/details/110195097
当然有的opencv版本下载下来是有static_lib文件夹的,里面有静态链接库。

  1. 动态编译出的exe文件,不会包括相应的动态链接库,可执行文件较小,dll库可动态卸载、安装,执行exe文件时,系统会按顺序在System32(如32位(x86)程序则是sysWOW64)、PATH、exe文件目录下寻找.dll文件,来完成执行。
  2. 静态编译出的exe文件,就使用的是静态库方式,不会有.dll文件,运行也不依赖.dll文件,可执行文件相对地较大。

VS配置方式

  1. 选择DEBUG or RELEASE;选择x64或x86(这两个设置需要与用的库文件版本一致)
  2. VC++\包含目录需要添加include、inc字样存放.h文件的文件夹;
  3. VC++\库目录中需要添加.lib文件的文件夹;
  4. 链接器\输入\附加依赖项中逐个添加头文件(.h)需要的依赖库(.lib),这个步骤和在代码中写宏定义(如下)应该是一样的。
	#pragma comment(lib,'.lib')
  1. 动态编译中,将.lib链接的.dll文件也要加入,加入方法有三种:
  1. 直接拷贝至可执行文件的目录(一般是DEBUG目录)下
  2. 拷贝至System32或sysWOW64文件夹下
  3. 将dll文件所在目录添加到系统的环境变量中

一个实例

实例取自我写的一个项目,见以下链接的兼容性配置部分:https://blog.csdn.net/qq_15036691/article/details/109995188

  1. 在工程文件夹下建立inclib文件夹。
    在这里插入图片描述

  2. opencv安装目录\build\include下的opencv2文件夹整个复制到.\inc文件夹下;
    C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\inc下的所有文件复制到.\inc文件夹下;
    pthreads安装目录\Pre-built.2\include下的所有文件复制到.\inc文件夹下;
    在这里插入图片描述

  3. opencv安装目录\build\x64\vc15\lib下的所有文件复制到.\lib文件夹下;
    C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\Lib\x64下的所有文件复制到.\lib文件夹下;
    pthreads安装目录\Pre-built.2\lib下的所有文件复制到.\lib文件夹下;
    在这里插入图片描述

  4. 右击属性管理器中的Debug|64,选择第一个“添加新的项目属性表”,保存在.\test(即源代码文件夹下)
    (这一步是方便以后调用这个属性配置表,不做也可以)
    然后双击这个添加了的属性配置表,在属性配置中,
    VC++目录 -> 包含目录:添加.\inc.\inc\opencv2
    VC++目录 -> 库目录:添加.\lib
    链接器 -> 输入 -> 附加依赖项:添加:

    kinect20.lib
    opencv_world450d.lib
    opencv_world450.lib
    pthreadVC2.lib
    ws2_32.lib
    或在代码中写入以下宏定义

    #pragma comment(lib,“kinect20.lib”)
    #pragma comment(lib,“opencv_world450d.lib”)
    #pragma comment(lib,“opencv_world450.lib”)
    #pragma comment(lib,“pthreadVC2.lib”)
    #pragma comment(lib,“ws2_32.lib”)

以上2、3、4两步,其实是为了在其他机器上方便编译用的

  1. 下一步就是去把与.lib导入库文件同名的动态链接库.dll文件加入.\x64\Debug中,,这一步是为了方便在其它计算机上运行可执行文件时,不会报错缺少.dll文件
    假设在一台装有VS的电脑上运行(如果没有VS那还要打包VS依赖的动态链接库,或者用静态编译?(没有试过)),那么需要打包的目前有kinect、opencv、以及pthread相关的dll,于是我在相关的安装目录下打包了如下的dll文件:
    在这里插入图片描述
  2. 这样的话接下来应该就可以把这个文件夹整个拷贝给一台配置有VS环境的电脑,然后就可以直接运行这个exe文件了应该。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值