MLK

OpenCV中文网上的《在MFC中使用OpenCV》堪称是OpenCV应用在Windows图形界面的范例,稍作修改就完全能够满足本科项目、课程设计、毕业设计的要求。这个程序据学长说,是用VC++ 6.0规范写的,如果用VS2008编译要稍作修改。而直接用VC++ 6.0编译却无法通过。

还是发个例程链接:

http://www.opencv.org.cn/index.php/%E5%9C%A8MFC%E4%B8%AD%E4%BD%BF%E7%94%A8OpenCV

经过师兄的指点以及自己的努力,今天完成了这个程序的调试。下面列出问题及解决方案:

1、第一个问题,也许是MFC初学者常犯的错误:fatal error C1083: Cannot open precompiled header file: 'Release/CVMFC.pch': No such file or directory

属于MFC基本问题,只需要执行build->rebuild all即可,应该是与StdAxf这系列文件有关。原因应该还复杂一些,但是现在我只注意到这一个。

2、当编译通过时,出现了如下错误

Linking...
CameraDSA.obj : error LNK2001: unresolved external symbol _IID_ISampleGrabber
CameraDSA.obj : error LNK2001: unresolved external symbol _CLSID_NullRenderer
CameraDSA.obj : error LNK2001: unresolved external symbol _CLSID_SampleGrabber
CameraDSA.obj : error LNK2001: unresolved external symbol _LOOK_UPSTREAM_ONLY
CameraDSA.obj : error LNK2001: unresolved external symbol _CLSID_CaptureGraphBuilder2
CameraDSA.obj : error LNK2001: unresolved external symbol _IID_ICaptureGraphBuilder2
Release/CVMFC.exe : fatal error LNK1120: 6 unresolved externals
Error executing link.exe.
CVMFC.exe - 7 error(s), 0 warning(s)

可以看出,是和CameraDSA.cpp有关。而CameraDSA.cpp只引用了一个头文件以及库,在程序中预处理代码如下

#include "stdafx.h"                         //  2010.8.14 修改
#pragma comment(lib,"Strmiids.lib") 

可以看出,这个程序需要用例程中的DirectShow\Lib文件夹下的strmiid.lib文件。当我们在tools->option->directories中的lib file中把此文件夹添加到最后时,我们惊奇地发现,继续编译仍然是这7个错误。

究竟是否使用了这个库文件,我们可以通过修改库文件名称来判断,将此句改为:

#pragma comment(lib,"Strmiids1.lib") 
LINK : fatal error LNK1104: cannot open file "Strmiids1.lib"

看来VC++的确能找到strmiids.lib这个文件。

而究竟例程中包含的这个库文件strmiid.lib是否含有_IID_ISampleGrabber这些外部符号呢?可以在windows中的cmd模式下通过这条命令来分析strmiid.lib文件:

C:\Program Files\Microsoft Visual Studio\VC98\Bin>dumpbin f:\CVMFC\DirectShow\Lib\strmiids.lib /all f:\a.txt

即lib文件的主要信息都打印到了a.txt中。

显示如下:

Dump of file f:\CVMFC\DirectShow\Lib\strmiids.lib
File Type: LIBRARY
Archive member name at 8: /               
3DEDB7C8 time/date Wed Dec 04 16:07:36 2002
         uid
         gid
       0 mode
    5AA7 size
correct header end
    854 public symbols
  ...
     B83A _IID_ISampleGrabber
  ...

既然例程中包含的strmiid.lib含有这些外部符号,那么可能的原因只有一个,就是windows系统SDK包含了strmiid.lib,而这货因为版本过高而在VC++6.0中无法支持,但VC++6.0检查到C:\Program Files\Microsoft Visual Studio\VC98\LIB中的strmiid.lib发现不兼容,就只报出这7个错误,不向下查找了自备的strmiid.lib了。

解决方法非常简单,但非常有用:就是在tools->option中的lib file把例程的lib文件夹前置到最顶头,就发现这7个错误消失了。

3、最后一个问题比较简单,网上也有相应的答案

could not execute Invalid directory
win32 error 267


方法:分别设置program->setting中的link和debug中的Executable for debug session和Working Directory还有working directory,一致即可。

最后希望这篇文章对于需要调试这个程序的人有些帮助,另外听师兄们说,VC++6.0太老了,不兼容的东西太多了,2005或者2008上手也很快。我希望在把VC++6.0用好的基础下,再选择上手一个更新的windows编译环境。

希望大家提点建议。

posted on 2011-02-25 07:56  emy_yu  阅读(8723)  评论(10编辑  收藏  举报