vs2013 错误和警告

LNK2001:

无法解析的外部符号 ___wargv
问题描述:
VS2010中,在共享DLL中使用MFC,运行库为/MD,Release版本下,调试运行出错
uafxcw.lib(appcore.obj) : error LNK2001: 无法解析的外部符号 ___argc
uafxcw.lib(appcore.obj) : error LNK2001: 无法解析的外部符号 ___wargv
问题来源:
为了解决uafxcw.lib(afxmem.obj) : error LNK2005的问题,我给Release下的附加依赖中添加了uafxcw.lib,忽略特定默认库中添加了uafxcwd.lib,此时为标准Windows,运行库为/MT,Release版本,出现了上述错误,改成在共享DLL中使用MFC,运行库为/MD,问题依然存在。
我的解决办法:
删除Release下的附加依赖中的uafxcw.lib和忽略特定默认库中的uafxcwd.lib,确保环境为在共享DLL中使用MFC,运行库为/MD,问题解决

 C2664:

不能将参数  从“const char [5]”转换为“LPCTSTR”

解决方法一:
在VC2010的解决方案管理器窗口内,右击你的项目“项目”,然后选“属性”(最后一项),再点“配置属性”,是个“+”号,把它展开,然后选“常规”选项卡,倒数第三项“字符集”,选择“使用多字节字符集”。问题解决。
不过还是建议使用Unicode,否则你的程序将有很大的局限性;要是你的程序只在西方发布还好,但毕竟是适应中国大陆的程序吧,所以建议使用Unicode。
解决方法二:
使用调用CString::AllocSysString();
例如:
CString str_cap("haha");(我直接这一句就够了)
 (const WCHAR *)(str_cap.AllocSysString()); 
 (LPCTSTR)(str_cap.AllocSysString()); 同上面效果相同

CString转换为const char*

CString str = gbStr;
const size_t strsize = (str.GetLength() + 1) * 2;
char * pstr = new char[strsize];
size_t sz = 0;
wcstombs_s(&sz, pstr, strsize, str, _TRUNCATE);

static_cast<int>(f)

LNK4006: 

_main 已在 luac.obj 中定义;已忽略第二个定义

说明有两个相同定义,找到注销到只留一个,或用其他方法只留一个

LNK4075: 

忽略“/EDITANDCONTINUE”(由于“/OPT:ICF”规范)

Debug版本与Release版本的lib不能混用,使用的时候要匹配上

因为Debug版本的项目去链接Release版本的 static库造成的错误,所以解决方案就是回到 ADDLIB项目,构建一个Debug版本的ADDLIB.lib,然后这边 Debug的 时候就用Debug\ADDLIB.lib,在Release的时候才用Release\ADDLIB.lib

具体为什么是这样 报错呢,很简单,去项目属性里面查看就知道了,Debug配置的时候,C/C++ -> 优化,这个配置项里面“全程序优化”的默认选项是“否”,但是在Release配置的 时候,是“是/GL”,由于不匹配,所以报错。同样的,对于C/C++ -> 代码生成,这个配置项里面“运行库”在Debug配置下默认是/MDd,但是在Release下默认是/MD,同样由于不匹配,报错。

所以坚持一个原则,无论是构建lib文件还是DLL文件,一定既要Debug的版本,也要Release的版本,而且在使用的时候一定要匹配上。才能尽可能避免这种问题。如果还是出现了类似问题,按照上面的思路去查找源头并修改你的配置即可。

C4996: 

'MBCS_Support_Deprecated_In_MFC': MBCS support in MFC.......

对于已经采用 MBCS  的旧版的VC++程序,我们不打算将其迁移至 Unicode,又不想见到大量的 C4996 警告,怎么办呢?关闭编译器的 C4996 警告,需要在项目-属性-c/c++-预处理器- 预处理器定义-下三角增加 NO_WARN_MBCS_MFC_DEPRECATION

 'fopen': This function or variable may be unsafe. Consider ......

方法一:将原来的旧函数替换成新的Security CRT functions。
方法二:用以下方法屏蔽这个警告。
1.在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:
  #define _CRT_SECURE_NO_DEPRECATE
2.#param warning(disable:4996)
3.更改预处理定义:
  项目->属性->配置属性->C/C++ -> 预处理器 -> 预处理器定义,增加_CRT_SECURE_NO_DEPRECATE 
方法三:方法二没有使用新的更安全的CRT函数,显然不是一个值得推荐的方法,可是你又不想一个一个地改,那么还有一个更方便的方法:
  在预编译头文件stdafx.h里(同样要在没有include任何头文件之前)定义下面的宏:
  #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
  在链接的时候便会自动将旧函数替换成Security CRT functions。
注意:这个方法虽然使用了新的函数,但是不能消除警告(原因见红字),你还得同时使用方法二。。。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值