zoukankan      html  css  js  c++  java
  • 在VC++6.0中调通官网上opencv和MFC完美结合的经典例程需要注意到几点问题

    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编译环境。

    希望大家提点建议。

  • 相关阅读:
    TCP协议
    数据包以及数据传输
    网络模型
    Executors常见的线程池创建以及其问题
    线程池
    阻塞队列和死锁
    ConcurrentHashMap
    ReentrantLock,公平性锁和非公平性锁
    Lock
    jQuery如何获取table中每一行的数据并发送给后端?
  • 原文地址:https://www.cnblogs.com/mlv5/p/1964355.html
Copyright © 2011-2022 走看看