vs 网络编程server与client代码调试_20200715调试记录(五十三)

本文记录了在VS中进行网络编程时遇到的问题,包括cout显示Mat类对象异常、动态链接与静态链接的区别、x86与x64平台的兼容性、Debug与Release模式的差异,以及调试过程中的LNK错误和解决方法。
摘要由CSDN通过智能技术生成

f8957faf5c81aab0ea5c1ab9f2c7203b.png

一、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();}

报错:

5578c5ac6ed20131575965ec84f0cfb3.png

百思不得其解

原因:同时使用过opencv的不同版本以及VS的不同版本

解决方法:

第一,进入系统的环境变量和系统变量,就是当初设置opencv的PATH路径,确保你所有的路径设置都是VC12,而不是VC10,我们知道VC10只试用与vs2010以前的版本,而VC12专门搭配VS2013平台。

c15dc43f6b5971286057713d1f577964.png

如果当初有用过vs2010,在里面设置过vc10下的lib,后来又把平台换成VS2013,设置了VC12的路径而忘记删除VC10,这次请把以前vc10的路径删掉,只保留VC12。

第二,把VS2010残留的文件夹删除,只需要删除当初残留的安装目录,经过这两个简单的步骤,程序可以正常运行。

6a34158c3ff632bb2a3c9183987887b6.png

二、动态链接和静态链接

    静态连接就是把需要的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模式下是不能一边调试一边修改代码的(启用了编辑并继续的)。调试时修改代码提示如下图:

3d6cde56067203b94cda3702df84a820.png

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直线拟合(五十)

法向量、旋转矩阵计算(五十一)

机器人手眼标定与变量设置调试(五十二)

8f7d51275c0c6094fb4a70f7c6dd40eb.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值