总括
记录学习到的一些基本的编程知识。。
参考链接: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文件夹的,里面有静态链接库。
- 动态编译出的exe文件,不会包括相应的动态链接库,可执行文件较小,dll库可动态卸载、安装,执行exe文件时,系统会按顺序在System32(如32位(x86)程序则是sysWOW64)、PATH、exe文件目录下寻找.dll文件,来完成执行。
- 静态编译出的exe文件,就使用的是静态库方式,不会有.dll文件,运行也不依赖.dll文件,可执行文件相对地较大。
VS配置方式
- 选择DEBUG or RELEASE;选择x64或x86(这两个设置需要与用的库文件版本一致)
- VC++\包含目录需要添加include、inc字样存放.h文件的文件夹;
- VC++\库目录中需要添加.lib文件的文件夹;
- 链接器\输入\附加依赖项中逐个添加头文件(.h)需要的依赖库(.lib),这个步骤和在代码中写宏定义(如下)应该是一样的。
#pragma comment(lib,'.lib')
- 动态编译中,将.lib链接的.dll文件也要加入,加入方法有三种:
- 直接拷贝至可执行文件的目录(一般是DEBUG目录)下
- 拷贝至System32或sysWOW64文件夹下
- 将dll文件所在目录添加到系统的环境变量中
一个实例
实例取自我写的一个项目,见以下链接的兼容性配置部分:https://blog.csdn.net/qq_15036691/article/details/109995188
-
在工程文件夹下建立
inc
、lib
文件夹。
-
将
opencv安装目录\build\include
下的opencv2文件夹整个复制到.\inc
文件夹下;
将C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\inc
下的所有文件复制到.\inc
文件夹下;
将pthreads安装目录\Pre-built.2\include
下的所有文件复制到.\inc
文件夹下;
-
将
opencv安装目录\build\x64\vc15\lib
下的所有文件复制到.\lib
文件夹下;
将C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\Lib\x64
下的所有文件复制到.\lib
文件夹下;
将pthreads安装目录\Pre-built.2\lib
下的所有文件复制到.\lib
文件夹下;
-
右击属性管理器中的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两步,其实是为了在其他机器上方便编译用的
- 下一步就是去把与.lib导入库文件同名的动态链接库.dll文件加入
.\x64\Debug
中,,这一步是为了方便在其它计算机上运行可执行文件时,不会报错缺少.dll文件。
假设在一台装有VS的电脑上运行(如果没有VS那还要打包VS依赖的动态链接库,或者用静态编译?(没有试过)),那么需要打包的目前有kinect、opencv、以及pthread相关的dll,于是我在相关的安装目录下打包了如下的dll文件:
- 这样的话接下来应该就可以把这个文件夹整个拷贝给一台配置有VS环境的电脑,然后就可以直接运行这个exe文件了应该。