PTAMM阅读笔记之EMGU CV的使用、 VC运行库版本冲突分析处理

3 篇文章 0 订阅

PART I:EMGU CV的使用

操作系统:Windows 7 x64 旗舰版;

编译环境:Visual Studio 2010;
Emgu CV(OpenCV for C#)版本:libemgucv-windows-x86-2.3.0.1416.exe

1、配置OpenCV2.3开发环境;
2、下载并安装Emgu CV的x86版,设置环境变量PATH:“C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin”;
3、测试Emgu,新建C#下Windows Form窗体应用程序,这里可以选择.net版本,由于需要在Unity3D中使用PTAMM,所以.net版本不能高于3.5,因此默认选择.net3.5;
4、导入UI插件,“工具”->“选择工具箱项…” ,在新打开的窗口中选择“.NET Framework组件”,点击“浏览”,到目录:C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin下,双击Emgu.CV.UI.dll即可;

5、添加References:Emgu.CV.dll、Emgu.CV.ML.dll、Emgu.CV.UI.dll、Emgu.Util.dll、ZedGraph.dll,这里需要注意的是上述dll均需要在.net3.5下重新编译。

C#版PTAMM运行结果如下(你懂的^-^):

Note: .net3.5版本控制、runtime library务必要一致。

PART II:VC运行库版本冲突分析处理(参考网址:http://blog.csdn.net/primer_programer/article/details/2031412)
C Runtime Library:
开关
对应的库
版本
/MD
MSVCRT.LIB
多线程DLL的Release版本
/MDd
MSVCRTD.LIB
多线程DLL的Debug版本
/MT
LIBCMT.LIB
多线程静态链接的Release版本
/MTd
LIBCMTD.LIB
多线程静态链接的Debug版本
/clr
MSVCMRT.LIB
托管代码和非托管代码混合
/clr:pure
MSVCURT.LIB
纯托管代码
 
C++ Standard Library:
开关
对应的库
版本
/MD
MSVCPRT.LIB
多线程DLL的Release版本
/MDd
MSVCPRTD.LIB
多线程DLL的Debug版本
/MT
LIBCPMT.LIB
多线程静态链接的Release版本
/MTd
LIBCPMTD.LIB
多线程静态链接的Debug版本

编译器会自动根据编译选项,选择对应的LIB文件。一般情况下这不会出现问题。
然而,在部分情况下,一旦你的程序的各个部分(LIB, OBJ…)并非由相同的编译选项编译出,而Link在一起的话,会出现各种各样的看似很难解决的问题,这类问题主要以重复定义的错误形式存在,通常的解决方法也很简单,就是选择同样的编译选项进行编译之后再Link。

分析一下错误来源,会发现:
1.     错误来源主要是重复定义的问题,而且重复定义的基本上都是VC Runtime和Standard C++ Library中的函数
2.     LIBCMT和LIBCPMT为Release下的Lib,本来不应该出现在Debug版本的链接的Lib中
3.     重复定义的问题主要出现在:LIBCMT, LIBCPMT, MSVCPRTD, MSVCRTD
来看看出问题的LIB是那些:
1.LIBCMT:C Runtime库的多线程静态链接的Release版本
2.LIBCPMT:C++ Standard Library的多线程静态链接的Release版本
3.MSVCPRTD:C++ Standard Library的多线程DLL的Debug版本
4.MSVCRTD:C Runtime Library的多线程DLL的Debug版本
当前我们的配置是多线程DLL的Debug版,因此3和4是应该出现在link的列表中的,不属于多余。而后两者则是只是当多线程静态链接Release版中才会出现。这提示我在项目中加入的XXX.LIB可能是造成这个问题的根源,因为静态库的编译选项很容易和主程序发生冲突,并且根据实际信息我们可以看出XXX.LIB应该是用多线程静态链接的Release版本来编译的。
这样,解决方法就很清楚了:
1.切换到Release,因为XXX.LIB是在Release下面编译的
2.把Run Time库的版本修改成多线程静态链接
做了这两个修改之后编译通过。
还有一种方法是,自己用多线程DLL的Debug版重新编译一次XXX,生成一个新的XXX.LIB,再link这个Lib也可以解决这个问题。
Summary
1.知道各个不同的LIB代表的版本信息非常重要,可以帮助快速定位问题
2.在编程的时候,一定要把所有的项目的编译选项(是静态链接Runtime库还是动态链接Runtime库,Debug/Release)配置成一样的。如果部分LIB/OBJ是由第三方提供(OBJ情况很少见),一般情况下只能调整自己的编译选项,除非你可以要求第三方提供其他版本的编译好的LIB
3.在发布可重用的静态LIB库供其他人调用的时候,最好对应不同的编译选项,乃至VC版本,提供不同版本的LIB。VC自己的Runtime就是最好的例子。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值