一、cout显示Mat类对象会跳出exceptional的解决方法
很简单的代码:
#include "opencv2/core/core.hpp"#include using namespace std;using namespace cv;void main(){ Mat M(2, 2, CV_8UC3, Scalar(255, 0, 0)); cout << "M=" << endl << " " << M << endl << endl; getchar();}
报错:
百思不得其解
原因:同时使用过opencv的不同版本以及VS的不同版本
解决方法:
第一,进入系统的环境变量和系统变量,就是当初设置opencv的PATH路径,确保你所有的路径设置都是VC12,而不是VC10,我们知道VC10只试用与vs2010以前的版本,而VC12专门搭配VS2013平台。
如果当初有用过vs2010,在里面设置过vc10下的lib,后来又把平台换成VS2013,设置了VC12的路径而忘记删除VC10,这次请把以前vc10的路径删掉,只保留VC12。
第二,把VS2010残留的文件夹删除,只需要删除当初残留的安装目录,经过这两个简单的步骤,程序可以正常运行。
二、动态链接和静态链接
静态连接就是把需要的MFC库函数放进你的exe之中,这样,在MFC库函数文件不在的情况下,你的exe仍然可以使用到这个库函数。
动态连接就与之相反,库函数不在exe之中,这样在运行时,就必须加载相应的MFC dll,否则无法正常运行。
所以,如果运行环境没有对应的库文件存在(比如没有安装vc),为了仍然能够运行,就要同时Copy相应的MFC DLL,或者采用静态链接的方式。
静态编绎是把所有需要的DLL都编绎到EXE文件里,这样就不需要在非VS2010的计算机上安装VS2010软件了或安装所需要的DLL;动态编绎不把所需的DLL编绎到EXE里,这样就需要把所需的DLL和EXE都考到别的计算机上才可以运行。
不管是动态编绎还是静态编绎,在DEBUG下编绎的EXE,在别的计算机上运行都需要一个DLL才行。
三、x86、x64的区别:
x86平台编译出来的exe(可执行文件)或dll(动态链接库)都是32位的;x64对应的则是64位的。
若你的启动项目,即主程序(编译出来是exe文件的)是x86平台下编译的,而它所依赖的一个项目(或动态链接库)是由x64位平台编译出来的,则会提示“未能加载文件或程序集...或它的某一个依赖性。试图加载格式不正确的程序。”之类的错误。这是因为32位程序不能加载64位的dll,更不能调用其中的类、方法和对象等。反之,若主程序是由x64平台编译出来的,而dll是x86的呢?答案。。也是不行的!
_WIN32是32位编译;_WIN64是64位编译。
之所以要分不同位数编译,最根本的目的就是提高软件的通用性。
如果电脑操作系统位数不同,那么代码中基本数据类型所占的字节也不同。
如:32位平台下long long是8个字节(64位),而64位平台下,long 是8个字节(64位)
64位操作系统理论上可以运行32位和64位软件,而32位操作系统只能运行32位的软件。
四、Debug与Release
Debug通常称为调试版本,它包含调试信息,(一般用做调试用)并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。所以一般都是用Release来打包发布程序,另外,Release打包出来的程序也相对来说会小一些。
但是在Release模式下是不能一边调试一边修改代码的(启用了编辑并继续的)。调试时修改代码提示如下图:
4.1. 区别
Debug——调试版,生成的.exe中包含很多调试信息,若直接发包,比较大;
Release——发布版
4.2. 如何区分是Debug编译还是Release编译
Debug编译有宏定义_DEBUG,若代码中定义了_DEBUG就表示是debug编译,否则是release
编译。
Eg: #ifdef _DEBUG
........ // 调试时执行,发布时不执行
#else
........ //
五、error LNK2005: __get_invalid_parameter_handler 已经在LIBCMTD.lib(invarg.obj) 中定义
问题描述:
在用vs2013编译程序的时候,release版本正常编译通过,但Debug版本提示下面的很多错误;
1>LIBCMT.lib(invarg.obj) : error LNK2005: “void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)” (?_invalid_parameter@@YAXPBG00II@Z) 已经在 LIBCMTD.lib(invarg.obj) 中定义
1>LIBCMT.lib(invarg.obj) : error LNK2005: “void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)” (?_invoke_watson@@YAXPBG00II@Z) 已经在 LIBCMTD.lib(invarg.obj) 中定义
1>LIBCMT.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler 已经在 LIBCMTD.lib(invarg.obj) 中定义
1>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
解决办法:
链接器->输入->忽略特定默认库: libcmt.lib
六、LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
问题说明:当安装VS2013之后,原来的.NET 4.0会被替换为.NET 4.5。卸载VS2013时,不会恢复.NET 4.0。
当VS2013安装后,VS2013的cvtres.exe就无法使用了。如果你的PATH环境变量中VS2010的工具路径第一个出现,而且链接器需要将.res文件转换为COFF 对象格式,就会导致LNK1123错误。
当VS生成PE文件头时,使用的cvtres.exe版本错误,不能与当前的.NET平台兼容。
解决方案:
【方法一】
当前系统中存在两个cvtres.exe文件,版本不同。让VS2010使用.NET 4.5的cvtres.exe程序。
具体步骤:
重命名或删除(把它剪切到外层目录即可):(vs2010安装的位置)C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe
这样C:\Windows\Microsoft.NET\Framework\v4.0.30319 (.NET 4.5)中的cvtres.exe文件就可以被VS2010使用,(一劳永逸)。
【方法二】
解决方法如下:
项目\属性\配置属性\清单工具\输入和输出\嵌入清单:原来是“是”,改成“否”。
说明:这种方法每个工程均需要修改配置。
【方法三】
安装:VS2010 SP1. 该版本应该是能使用.NET 4.5的,并配有正确的cvtres.exe版本。
注意:安装VS 2010 SP1 时会移除64-bit 编译器. 通过安装 VS 2010 SP1 compiler pack 能够重新获得。
【方法四】
卸载.NET 4.5,重装.NET 4.0
机器人实时纠偏系统(一)机器人实时纠偏(二)OpenCV+VS开发环境配置(三)结构光视觉的焊接机器人纠偏(四)结构光视觉的机器人焊接(五)结构光视觉的机器人焊接(六)机器人初始点导引(七)MATLAB标定相机参数(八)机器人的手眼标定(九)机器人坐标获取(十)机器人调试(十一)TCP/IP客户端API编程(十二)结构光传感器上位机界面多线程编程(十三)TCP&UDP(十四)C/C++ Programing(十五)机器人扫描与跟踪调试(十六)结构光传感器库函数(十七)结构光传感器编程(十八)C/C++ Programing(十九)C/C++ Programing(二十)结构光传感器编程(二十一)DX200操作要领(二十二)DX200操作要领(二十三)工装轴协调(二十四)无夹具协调(二十五)图像处理调试(二十六)STM32MODBUS_CRC编程(二十七)在C++中调用Matlab函数(二十八)
机器人手眼标定MATLAB及C++实现
机器人位姿运算及Eigen的使用(三十)
OpenCV与Eigen矩阵运算(三十一)
VS中数据读写及OpenCV拟合(三十二)
VS2013配置OpenGL库(三十三)
曲线拟合/插值(三十四)
曲线拟合绘制滤波及机器人平移(三十五)
DX200操作要领—示教1(三十六)
直接打开与平移变换(三十七)PAM与镜像平移变换(三十八)
修改与编辑程序(三十九)
YRC1000 宏程序命令(四十)
程序编辑与试运行(四十一)
程序编辑与再现(四十二)
再现(四十三)
程序管理(四十四)
便捷功能(四十五)
便捷功能(四十六)
椭圆拟合(四十七)
RANSAC直线拟合(四十八)
读写CSV文件类(四十九)
RANSAC直线拟合(五十)
法向量、旋转矩阵计算(五十一)
机器人手眼标定与变量设置调试(五十二)