VS (Qt/MFC)常见编译问题

1、error C4996: ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

原因

这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。库函数改写例子:
mkdir改写为 _mkdir
fopen”改写为 fopen_s
stricmp改写为 stricmp_s
sprintf改写为sprintf_s
strcpy改写为strcpy_s

解决

1、VS2005后使用带“_s”后缀的非标准函数,如sprintf改为sprintf_s

char filename[1024];//需要预先分配缓冲区

char path1[128] = "D:\\Program\\Tesseract-OCR\\tesseract.exe";
char path2[128] = "D:\\Program\\Tesseract-OCR\\";
 
//sprintf(filename, "%s %s", path1,path2);
sprintf_s(filename, sizeof( filename ), "%s %s", path1,path2);

2、项目属性->配置属性->C/C++ ->预处理器(Preprocessor)->预处理器定义(Preprocessor Definitions)
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE这两个宏。

2、error C4996: ‘inet_addr’: Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings

原因

在VS2013以后的版本中,增加了inet_pton()、InetPton()之类的新函数,用于IP地址在“点分十进制”和“二进制整数”之间转换,并且能够处理ipv4和ipv6。而inet_addr是老函数,高版本VS在编译时默认使用了新函数,所以会报该错误。

解决

1、用所提示的inet_pton新函数代替inet_addr函数。

#include <ws2tcpip.h>
... ...
    //sockAddr.sin_addr.s_addr = inet_addr(ip);
	inet_pton(AF_INET, ip, &sockAddr.sin_addr);

2、修改VS配置如下(两种):
a、项目 -> 属性 -> C/C++ ->常规(General)->SDL检查(SDL checks),将“是(Yes)”改为“否(No)”,即可使用老函数。

b、项目属性->配置属性->C/C++ ->预处理器(Preprocessor)->预处理器定义(Preprocessor Definitions)
添加“_CRT_SECURE_NO_WARNINGS”

3、error LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL’: value ‘0’ doesn’t match value ‘2’ in ***

原因

引用依赖Release的库,对Debug不兼容,在Debug模式下无法编译通过

解决

更换成Release模式编译,或者更换相应库

4、无法定位程序输入点?toLower@QString@@QEHAA?AV1@XZ ***

原因

使用的QT版本不对导致。

解决

替换对应QT版本的库

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值