开发库引用: 重要说明:
目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。
静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。
动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。
导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
那么,我们拿到开发包了以后主要看看里面的文件有哪几个?
一般相机或者图像库的开发包一般包含以下3个目录:
1.include文件夹:可以手动提取开发的头文件*.h放到该目录;
2.lib文件夹:可以手动提取*.lib文件放到该目录,注意该文件里面只有编译用的符号没有实质的运行代码;
3.bin文件夹:也就是最后我们的实际实现文件*.dll,相当于我们类里面的cpp,核心代码就在这里面;
首先我们把这些文件放入到对应名称的文件夹,比如我已经提取了Halcon里面的文件,起名就叫HalconSDK;
然后我们新建一个VC工程,将Halcon放置到解决方案的住程序目录下;
比如新建MFC工程名字是HalconDemo,那么该工程的HalconDemo目录结构如下:
==========================================================
HalconDemo.sln;
HalconDemo文件夹
(注意,这个文件夹和解决方案目录名称是一样的,但这个是工程目录,开发包就放这个文件里面,和*.vcxproj文件在同一级)
例如:我这里工程是MERDEMO,那么他的主代码是放在MERDEMO\MERDEMO下面的,开发包也该放这个位置。
==========================================================
放好了开发包以后进入到VC工程里,在工程名称右键“属性”打开属性页设置:
1.C/C++里面第一项添加附加头文件目录里面添加代码:
2.linker(链接器)里面 第九项添加导入库路径:
以上两步的目的是把这两个目录作为程序里面引入文件的根目录,那么在文件里面引用文件就可以直接用基于当前路径的相对路径了
如:
$(ProjectDir)\HalconSDK\include
$(ProjectDir)\HalconSDK\include\cpp
这个是我添加的halcon 头文件的路径,那么我要HalconSDK\include\cpp下的halconcpp.h文件只需要在VC工程里面 任意一个头文件里面
包含$include "halconcpp.h"就可以了?是不是很简单?不然就就得写多几个路径了。。。
我们知道include的作用是把头文件链入到cpp里面,通过#include函数就可以实现头文件和cpp文件在一起了。声明了函数同时去实现,
那么程序就没有问题了不是?
但是,对于导入开发包来说是不是一样的呢?其实是一样的道理。
刚刚我们制定了开发包的路径,同时引入了头文件,但是没有实现文件与之对应,那么我们编译程序是不是会出现一大堆的类似“无法找到外部符号”的错误啊?
其实这个已经很明显了,因为我们的程序里面.h和.cpp都是对应好了,所以没有问题,但是对于开发包来说,他不可能把实现的源代码给你,
你要的做的是什么,就是引入他给你提供的函数名称或者变量进行使用,那么引入了.h文件我们是不是就可以知道他的库里面有哪些函数或者
变量了呢???
但是,知道了函数或者变量,但是没法编译啊?所以,开发包里面给我们提供了一个叫.lib的引入库文件(不是静态库),该文件的目的就是告诉
编译器,我是一个引导库文件,我的目的是把你刚刚输入进去的.h文件里面函数与我所对应的dll文件建立一个映射关系。告诉编译器,头文件里面的
函数名称和我这里的函数实现映射关系可以对应,没有问题。所以,编译通过。。。
但是,lib文件仅仅只用于编译阶段,他没有实际实现代码,全靠和他名称对应的dll才有用,所以当我们写完了代码以后,在运行的时候,需要把对应的
.dll文件和exe放在一堆方可执行。
为啥要放一堆呢???请自行百度exe调用dll的查找优先级。。。
是不是很简单。。。
还有一个问题就是,拿到别人的相机二次开发包怎么办???
其实道理是一样的,按照上面的目录,我们分3个目录放进入,当然文件少的话就放一个目录也是可以的。
这样的话,我们除了相机官方的头文件是不是还有一个我们自己封装的头文件呢???这些都是属于include文件夹的。
注意:我们在二次开发的时候已经引入过了,所以在生成的dll里面已经包含了正常的相机的代码,所以拿到头文件看看里面有没有变量是相机
本身的,如果没有,那么只需要我们二次开发提供的头文件就可以了。。。
那么最终的文件是:*.h *.lib *.dll
和上面的引用是一样的,但是唯一区别在于,我们的dll里面的实现是不是依靠的是相机里面的dll啊?
那在编译成功后,需要把我们二次封装后的dll和相机官方的dll一起放到exe同级的目录下,切记切记!!!
本文纯手动打,请各位学员自己学习,请勿传播!!!
珍重下个人劳动成果,这样才有更多的东西分享给你们!!! by hgzhu
|