VC++ 2005编译链接错误汇总

C++ 2005编译链接错误汇总
--------------------------------------------------------------------------
1 文本字体需要使用Unicode,编译错误C2220和警告C4819
2 没有找到MSVCR80D.dll
3 默认库“MSVCRT”与其他库的使用冲突
4 warning C4996: 'getch' was declared deprecated
iostream.h 和 iostream
warning LNK4204: “…\Debug\vc80.pdb”缺少引用模块的调试信息
7 去掉字符串操作函数的警告信息"_CRT_SECURE_NO_DEPRECATE"
--------------------------------------------------------------------------
1 编译错误C2220和警告C4819
错误描述(在vs2005中,特别是查看别人的代码)
.crt_dbg1.c : error C2220: warning treated as error - no 'object' file generated
.crt_dbg1.c : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

只需要对次文件 Ctrl+A ,Ctrl+X, 然后再 Ctrl+V就搞定。(使文件变为unicode) VC++ <wbr>2005编译链接错误汇总
--------------------------------------------------------------------------
2 没有找到MSVCR80D.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题:
1)微软对于这个问题应该也有处理,不过感觉不是很人性化。在“属性->配置属性->清单工具->常规“下有一个”使用FAT32解决办法,把它选成是,就可以了。(注意:一定要先配置这个选项,然后再编译工程,要不然还是不好用:)

2)找到你的工程的文件夹,如(myproject),找到其下的myproject\myproject\Debug\ myproject.rec,把它删掉(删掉整个Debug目录也可以),重新编译,搞定!
 
默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
打开此项目的“属性页”对话框;单击“链接器”文件夹;单击“输入”属性页;选择“忽略所有默认库”属性或在“忽略指定库”属性中指定要忽略的库列表。“命令行”属性页将显示对这些属性所做的更改的效果。
此问题在linker input 附加依赖项中添加: /nodefaultlib:msvcrt.lib
--------------------------------------------------------------------------
warning C4996: 'getch' was declared deprecated
使用_getch()代替原有的getch().
在使用VC 2005 的开发者会遇到这样的问题,在使用std命名空间库函数的时候,往往会出现类似于下面的警告:      warning C4996: strcpy was declared deprecated      出现这样的警告,是因为VC2005中认为CRT中的一组函数如果使用不当,可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如:strcpy、strcat等。      对于这些问题,VC2005建议使用这些函数的更高级的安全版本,即在这些函数名后面加了一个_s的函数。这些安全版本函数使用起来更有效,也便于识别,如:strcpy_s,calloc_s等。      当然,如果执意使用老版本、非安全版本函数,可以使用_CRT_SECURE_NO_DEPRECATE标记来忽略这些警告问题。办法是在编译选项 C/C++ | Preprocessor | Preprocessor Definitions中,增加_CRT_SECURE_NO_DEPRECATE标记即可。
--------------------------------------------------------------------------
iostream.h 和 iostream
iostream.h  和 iostream两个是不同的东东。前者是传统库函数中的头文件,后者(没有.h)是标准库中的头文件。而标准库中的东西,都是定义在std名字空间里,是为了防止污染全局名字空间。
如果使用 iostream 头文件,就需要引用std,即加上using namespace std。
--------------------------------------------------------------------------
warning LNK4204: “…\Debug\vc80.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
终于搞清楚了:如果生成的是 debug 模式的可执行文件但链接的却是 release 库,或者,如果生成的是 release 版本的可执行文件但链接的却是 debug 库,那么就出现上述问题。
--------------------------------------------------------------------------
7 去掉字符串操作函数的警告信息"_CRT_SECURE_NO_DEPRECATE"
解决办法:
        右键该项目,属性-->配置属性-->c/c++-->预处理器-->预处理器定添加如下字段_CRT_SECURE_NO_DEPRECATE标记即可。
或者
Project -> Properties   -> C/C++ -> Command Line加入/D "_CRT_SECURE_NO_DEPRECATE"

 

    出现这样的警告,是因为VC2005中认为CRT中的一组函数如果使用不当,可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如:strcpy、strcat等。对于这些问题,可以使用_CRT_SECURE_NO_DEPRECATE标记来忽略这些警告问题。方法如上。

 

1.Wp64检测64位可移植性问题,导致warning( 4244,4267,4311,4312)
2.链接器 -> 优化 -> Windows98优化 去除,可省十几k.
3.msvcp60.dll和 msvcp71.dll是使用vc标准库时被连入的,即使使用了一个函数,也需要发布几百k的dll,非常的讨厌.对于Vc.net2003可以使用#define _STATIC_CPPLIB静态链接msvcrp.dll,消除dll引用.VC6需要改动内部实现代码,没有好的解决手法.若一个静态库使用了_STATIC_CPPLIB,所有使用该静态库的程序必须也使用_STATIC_CPPLIB,否则链接出错(链接纯C库没有这个问题).应该保证让_STATIC_CPPLIB作用到所有使用到c++标准库的cpp文件.
4.程序无法启动,编译新旧文件杂揉原因导致C库混乱,如应当编译出错的文件被编译过了.

5.Solid_D.lib(BP_Scene.obj) : warning LNK4204: “f:\Gamedev\Objs\DestinyMatrix\D\vc70.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
Solid_D.lib(BP_Scene.obj) : warning LNK4204: 'f:\Gamedev\Objs\DestinyMatrix\D\vc70.pdb' is missing debugging information for referencing module; linking object as if no debug info

LNK4204是个很含糊的warning,也很讨厌.MSDN上说是f:\Gamedev\Objs\DestinyMatrix\D\vc70.pdb文件是损坏的,要求重编,谬之甚已.上文的实际意思是找不到Solid_D.lib编译对应的vc70.pdb,比如Solid工程被Clean了.Solid_D.lib里有其对应的vc70.pdb的绝对路径,所以Solid_D.lib可以被复制到任何工程目录,而调试时IDE能找到lib对应的调试信息.一旦其对齐的vc70.pdb被删除就出现LNK2404.
IDE的工程Clean也有问题,它的Clean不是严格Clean指定工程的中间文件,而是Clean掉工程的中间目录,如果设定多个项目的中间目录为一个目录,且相互依耐,编译就会出现问题,编译完全紊乱.特别是vc70.pdb只剩下最后一个被编译的工程的.

copy "$(TargetPath)" F:\Gamedev\Libs\
中间有空格的TargetPath要加上"",否则空格导致copy失败

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值