VS2008 编译 链接器错误以及使用C语言函数的警告
2013-01-16 11:22
267 查看
在使用VS做项目的时候,在VS2005的版本开始,经常会出现两类错误,一个是在编译的时候,连接器经常死掉,无法成功编译,另外一个是使用了C语言函数后,会发出警告。
下面分别来说说这两个问题的解决方案。
一,链接器无法正常工作的解决方法:
在使用VS开发,进行编译时,往往在语法没有错误的情况下,依然会频繁的出现链接失败,通常情况下,再build一次就好了。这个问题往往是由于增量链接导致的,可以在项目的属性中,进行配置,不进行增量链接,就可以解决这个问题了。具体步骤是,project->Properties->Linker->Enable Incremental Linking设置为No(/Incremental:NO)即可。中文版的是工程->属性->链接->增量链接,设置为NO。默认情况下,这个设置是YES,当设置为NO时,链接器无法正常工作的问题往往都能解决了。
二、使用C语言函数报警告的解决方法:
在开发过程中,若使用了某些C语言函数,可能会遇到很多警告,如
warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 10.0\vc\include\string.h(105) : 参见“strcpy”的声明
warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234) : 参见“fopen”的声明
等等诸如此类的警告,这些警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。
解决方案:
1> 根据下面的warning提示:参见“fopen”的声明
消息:“This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.”
所以可以将函数按warning提示的第二句,改为使用fopen_s函数即可:
例如:FILE *pFile=fopen("1.txt", "w");
改为:
FILE* pFile;
fopen_s(&pFile, "1.txt", "w");
2> 还是根据warning提示的地三句话:use _CRT_SECURE_NO_DEPRECATE
项目|属性|配置属性|C/C++|命令行|附加选项,加入(/D "_CRT_SECURE_NO_DEPRECATE" )(注:加入中括号中完整的内容)
3> 降低警告级别:项目|属性|配置属性|C/C++|常规,自己根据情况降低警告级别(此法不推荐)
注意:高度重视警告:使用编译器的最高警告级别。应该要求构建是干净利落的(没有警告)。理解所有警告。通过修改代码而不是降低警告级别来排除警告。
编译器是你的朋友。如果它对某个构造发出警告,这经常是说明你的代码中存在潜在的问题。
下面分别来说说这两个问题的解决方案。
一,链接器无法正常工作的解决方法:
在使用VS开发,进行编译时,往往在语法没有错误的情况下,依然会频繁的出现链接失败,通常情况下,再build一次就好了。这个问题往往是由于增量链接导致的,可以在项目的属性中,进行配置,不进行增量链接,就可以解决这个问题了。具体步骤是,project->Properties->Linker->Enable Incremental Linking设置为No(/Incremental:NO)即可。中文版的是工程->属性->链接->增量链接,设置为NO。默认情况下,这个设置是YES,当设置为NO时,链接器无法正常工作的问题往往都能解决了。
二、使用C语言函数报警告的解决方法:
在开发过程中,若使用了某些C语言函数,可能会遇到很多警告,如
warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 10.0\vc\include\string.h(105) : 参见“strcpy”的声明
warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234) : 参见“fopen”的声明
等等诸如此类的警告,这些警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。
解决方案:
1> 根据下面的warning提示:参见“fopen”的声明
消息:“This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.”
所以可以将函数按warning提示的第二句,改为使用fopen_s函数即可:
例如:FILE *pFile=fopen("1.txt", "w");
改为:
FILE* pFile;
fopen_s(&pFile, "1.txt", "w");
2> 还是根据warning提示的地三句话:use _CRT_SECURE_NO_DEPRECATE
项目|属性|配置属性|C/C++|命令行|附加选项,加入(/D "_CRT_SECURE_NO_DEPRECATE" )(注:加入中括号中完整的内容)
3> 降低警告级别:项目|属性|配置属性|C/C++|常规,自己根据情况降低警告级别(此法不推荐)
注意:高度重视警告:使用编译器的最高警告级别。应该要求构建是干净利落的(没有警告)。理解所有警告。通过修改代码而不是降低警告级别来排除警告。
编译器是你的朋友。如果它对某个构造发出警告,这经常是说明你的代码中存在潜在的问题。
相关文章推荐
- Linux系统平台下关于GCC编译及使用的方法 (-Werror,它要求GCC将所有的警告当成错误进行处理
- 使用vs2008 的OutputDebugString 时编译产生的错误
- vs2008编译出现错误 error C2220: 警告被视为错误 - 没有生成“object”文件
- Linux系统平台下关于GCC编译及使用的方法(-Werror,它要求GCC将所有的警告当成错误进行处理 )
- Linux系统平台下关于GCC编译及使用的方法(-Werror,它要求GCC将所有的警告当成错误进行处理 )
- Youcompleteme插件使用条件编译(CompileFlags)去除警告和错误
- Win7 64b的VS2015 如何使用nmake成功编译detour express 3.0-error2202 警告被视为错误 - 没有生成“object”文件
- OpenCv在win下静态库的编译和使用,以及部分无法解析外部符号的错误解决
- Xcode编译WebApps找不到js的错误解决办法以及Xcode编译错误和警告汇总
- 使用vs2015编译器编译libpqxx时发生的错误以及解决办法
- Linux系统平台下关于GCC编译及使用的方法(-Werror,它要求GCC将所有的警告当成错误进行处理 )
- vs2008编译tamarin出现错误c2220:警告被视为错误
- 关于VC6.0++中以及VS2008中编译出现的LINK错误
- 使用 Cocoapods 集成框架 Operation not permitted - /usr/bin/xcodeproj,以及项目出现 Invalid bitcode signature 编译错误
- 关于VC6.0++中以及VS2008中编译出现的LINK错误
- iOS 中使用 XIB 自定义cell 的两种方法 以及 编译出现常见 的错误 ++++(xcode6.0之后)
- C++中,结构体vector使用sort排序(以及sort参数错误问题)
- VS2008 warning C4627 在查找预编译头使用时跳过 解决方案
- AndroidUiAutomator使用Jenkins搭建持续集成测试系统Ⅰ—Android UiAutomator以及快速编译方法
- xcode使用技巧,快筛选错误,屏蔽警告